OpenCV,PIL,skimage 比较
1.读取图片方式:
- PIL:open
- opencv、skimag:imread()
2.读取内容:
- PIL: PIL对象?(可用
np.array(img)
转矩阵。) 通道排列:RGB - skimage:numpy矩阵,通道排列:RGB
- opencv:numpy矩阵,彩色图片维度是 HWC(高度,宽度,通道数)。数据类型是uint8;
opencv对于读进来的图片的通道排列是 BGR ,而不是主流的 RGB!谨记!
3.转灰度图像
skimage有一个巨大的不同是读取灰度图时其图像的矩阵的值被归一化了,注意注意!
一.opencv
cv2.connectedComponents 连通域
""" cv2.connectedComponents(image,connectivity=8) 计算连通域进行区域分析
Input:
image:必须是二值图,即8位单通道图像。
参数:connectivity = 4 or 8; 四像素连接连接沿边缘具有相同值的所有像素;八像素连接连接沿边缘和角落具有相同值的所有像素。
Return:
num_labels:所有连通域的数目(即变化区域数目)
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
加强版(返回更多参数): cv2.connectedComponentsWithStats()
"""
cv2.morphologyEx 形态学
开运算
闭运算
cv2.findContours 轮廓检测
contours, hierarchy = cv2.findContours(image,mode,method)
- image:输入图像
- mode:轮廓的模式。cv2.RETR_EXTERNAL只检测外轮廓;cv2.RETR_LIST检测的轮廓不建立等级关系;cv2.RETR_CCOMP建立两个等级的轮廓,上一层为外边界,内层为内孔的边界。如果内孔内还有连通物体,则这个物体的边界也在顶层;cv2.RETR_TREE建立一个等级树结构的轮廓。
- method:轮廓的近似方法。cv2.CHAIN_APPROX_NOME存储所有的轮廓点,相邻的两个点的像素位置差不超过1;cv2.CHAIN_APPROX_SIMPLE压缩水平方向、垂直方向、对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需要4个点来保存轮廓信息;cv2.CHAIN_APPROX_TC89_L1,cv2.CV_CHAIN_APPROX_TC89_KCOS
- contours:返回的轮廓
- hierarchy:每条轮廓对应的属性
注意:cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。
# 灰度化和二值化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
cv2.drawContours 在图像上绘制轮廓。
cv2.contourArea 轮廓区域面积计算
单位是像素平方。
contourArea()求的是封闭曲线内面积 (使用格林公式,求曲面积分)
几何面积求的是最小外接矩的面积。
所以才使得contourArea()求出来的面积和宽高面积不一样,且永远小于看宽高面积。
由于在计算面积得时候丢失了外围像素,因此contourArea()求出来的面积比真实面积要小。
OpenCV(一) | contourArea()求得的面积是哪里的面积?
cv2.arcLenngth 轮廓周长
perimeter = cv2.arcLength(cnt,True)
True表示闭合,False表示曲线?
cv2.approxPolyDP 轮廓近似
也可以理解为曲线 折线化。
"""
epsilon参数表示 从原始轮廓到近似轮廓的最大距离(大于此阈值则舍弃),它是一个准确率参数。
一般通过 轮廓周长计算定义。值越小,越精确。
"""
epsilon = 0.1*cv2.arcLength(cnt,True) # 0.005
approx = cv2.approxPolyDP(cnt,epsilon,True)
cv2.convexHull 凸包
凸包看起来类似轮廓近似,但是它不是(两者在某些情况下可能提供相同的结果)
hull = cv2.convexHull(cnt)
cv2.isContourConvex(contour) 检查曲线是否凸起
外接
cv.boundingRect 直边外接矩形
cv.minAreaRect 最小外接矩形
cv2.minEnclosingCircle 最小封闭圈
cv2.fitEllipse 拟合椭圆
cv2.fitLine 拟合直线
二.skimage
morphology 形态学
from skimage import morphology
官方文档:https://scikit-image.org/docs/stable/api/skimage.morphology.html
morphology.remove_small_holes 移除小空洞
morphology.remove_small_objects 移除小物体
morphology.convex_hull_object 凸包
计算二值图像中单个对象的凸包图像
skimage.morphology.convex_hull_image() 计算二值图像的凸包图像。
其他
rasterio
from rasterio import features
features.shape
https://rasterio.readthedocs.io/en/latest/api/rasterio.features.html
rasterio.features
用于处理栅格数据集中要素的函数。
# 获取数据集或数组中连接区域的形状和值。
rasterio.features.shapes(source, mask=None, connectivity=4, transform=Affine(1.0, 0.0, 0.0, 0.0, 1.0, 0.0))
def find_contours(image, bkg_value=0):
assert image.dtype == np.uint8
# Tuple(GeoJSON, value)
shapes = features.shapes(image, mask=image != bkg_value)
results = [(int(v), geometry.shape(s)) for s, v in shapes]
return results