Opencv常用算子介绍

1、 cv2.threshold()函数

T,binary = cv2.threshold(  # 输出阈值和二值化图
	src = inputimg, 
    thresh=125,  # 二值化阈值
    maxval=255,  # 输出二值化图灰度值
    type=cv2.THRESH_BINARY  # 方法选择参数
    #  cv2.THRESH_BINARY	(>thresh的像素点,灰度值=maxval,否则,灰度值=0)
	#  cv2.THRESH_BINARY_INV(<thresh的像素点,灰度值=maxval,否则,灰度值=0)
	#  cv2.THRESH_TRUNC 	(>thresh的像素点,灰度值=maxval,否则,灰度值不变)
	# cv2.THRESH_TOZERO(>thresh的像素点,灰度值不变,否则,灰度值=0)
	# cv2.THRESH_TOZERO_INV:(>thresh的像素点,灰度值=0,否则,灰度值不变)
    #  cv2.THRESH_OTSU      (OTSU阈值化,输出阈值是使用二值化阈值)
)

2、cv2.adaptiveThreshold()函数

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
#src:灰度化的图片
#maxValue:满足条件的像素点需要设置的灰度值
#adaptiveMethod:自适应方法。有2种:ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C
#thresholdType:二值化方法,可以设置为THRESH_BINARY或者THRESH_BINARY_INV
#blockSize:分割计算的区域大小,取奇数
#C:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
#dst:输出图像,可选

3、cv2.connectedComponentsWithStats()函数

retval, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8)
#image : 是要处理的图片,官方文档要求是8位单通道的图像。
#connectivity : 可以选择是4连通还是8连通。
#retval : 返回值是连通区域的数量。
#labels : labels是一个与image一样大小的矩形(labels.shape = image.shape),其中每一个连通区域会有一个唯一标识,标识从0开始。
#stats :stats会包含5个参数分别为x,y,h,w,s。分别对应每一个连通区域的外接矩形的起始坐标x,y;外接矩形的wide,height;s其实不是外接矩形的面积,实践证明是labels对应的连通区域的像素个数。
#centroids : 返回的是连通区域的质心。
#注意:该算子计算的最大连通域是整幅图像,需要排除掉。

4、计算图像二值化后最大连通域的平均灰度值示例

mask = np.zeros(img.shape, np.uint8)
maxarea=0
maxindex=-1
for i in range(retval):
    area = stats[i][-1]
    if(area>maxarea and i>0):
        maxarea=area
        maxindex=i
mask[labels == maxindex] = 255
num=cv2.countNonZero(mask)
mean_gray=cv2.mean(img,mask)

5、im.shape, [-1], [:-1], [::-1]

im=cv2.imread('dir')
print(im.shape)#高、宽、channel
print(im.shape[-1])#最后一个元素
print(im.shape[:-1])#高、宽
print(im.shape[::-1])#倒序

6、cv2.erode和 cv2.dilate

 np.zeros((h,w), np.uint8)
 math.dist(p1,p2) 
(mask == val).astype("uint8") * 255
 arr[:,-1]#所有行最后一列
kernel = np.ones((5, 5), np.uint8)
des = cv2.erode(src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
 #src 是需要腐蚀的原始图像
#kernel 代表腐蚀操作时所采用的结构类型。
#anchor 代表element结构中锚点的位置,默认为(-1,-1),在核的中心位置。
#iterations 是腐蚀操作的迭代的次数,默认为1
#borderType 代表边界样式
des =  cv2.dilate(src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )

7、np.where

#np.where(condition, x, y),即condition为条件,当满足条件输出为x,不满足条件则输出y.:
a = np.arange(10)
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(np.where(a > 5, 1, -1))
#[-1, -1, -1, -1, -1, -1,  1,  1,  1,  1]
print(np.where([[True,False], [True,True]],[[1,2], [3,4]],[[9,8], [7,6]]))
#[[1,8],[3,4]]

x = np.arange(9.).reshape(3, 3)
print(np.where( x > 5 ))
#(array([2, 2, 2]), array([0, 1, 2]))
print(x[np.where( x > 5 )])
#[6. 7. 8.]

8、二值化,找到最大连通域,求最小外接圆#关键是如何把区域转化成点

_, thres_laser = cv2.threshold(im[:, :, 0], 200, 255, 0)
#下面这一行也可以区域转成点
#qqqq=cv2.findNonZero(thres_laser)
#res_cir = cv2.minEnclosingCircle(qqqq)
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thres_laser, connectivity=8)
points=None
for i in range(num_labels):
    area = stats[i][-1]
    if (area > 12000)  and (i > 0):
        points=np.where(labels == i)   #得到一个tuple(xlist,ylist)
        break

if(points!=None):
    res_cir=cv2.minEnclosingCircle(np.vstack((points[0],points[1])).T) #转成点集np.vstack((points[0],points[1])).T
    mask_circle= np.zeros(im.shape[:-1], dtype=np.uint8)
    mask_circle = cv2.circle(mask_circle, (round(res_cir[0][1]),round(res_cir[0][0])), round(res_cir[1]), 255, -1)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值