图像处理相关(opencv,skimage等)

知乎:OpenCV,PIL,skimage你pick谁

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值