第一步先读图
从原图中发现,此图对比度较差,所以应该先读出灰度图,然后再做处理。
img = cv2.imread('/Users/qiaoye/Desktop/9.9.jpg')
img_gray_yuantu= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
es_limao = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4,4))
es_dingmao = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (13, 13))
初始化了两个卷积核,方便后边调用
因为原图的对比度较差,所以这里采用了直方图归一化的方法,增加图像的对比度,尤其是螺母的对比度
img_gray = cv2.normalize(img_gray_yuantu,None,0,255,cv2.NORM_MINMAX)
之后用均值滤波,过滤椒盐噪声
img_gray = cv2.medianBlur(img_gray,7)
cv_show('img',img_gray)
之后是对图像进行自适应阈值处理
img_gray = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 2)
img_gray = cv2.medianBlur(img_gray,5) #降噪
cv_show('img_thre',img_gray)、
可以发现动态处理后的效果非常棒
因为我是习惯检测点是白的,所以做了一步这样的处理
img_gray = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)[1]
cv_show('ig',img_gray)
之后用闭操作进行处理,因为有的地方的点不是很清楚就用了闭操作
img_gray = cv2.morphologyEx(img_gray,cv2.MORPH_CLOSE,(3,3))
cv_show('img_ec',img_gray)
img_gray = cv2.morphologyEx(img_gray,cv2.MORPH_CLOSE,(4,4))
cv_show('close_',img_gray)
之后是用findcounter查找框
cnts1,hierarchy = cv2.findContours(img_gray.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#cnts,hierarchy = cv2.findContours(img_gray_yuantu.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts1
cur_img = img
#cv2.drawContours(img,cnts,-1,(0,255,0),1)
#cv2.drawContours(cur_img,cnts1,-1,(0,255,0),1)
cv_show('img_count_qie',cur_img)
#cv_show('img_yuantu',img_gray_yuantu)
for c in cnts:
s = cv2.contourArea(c)
#s = cv2.arcLength(c,True)
(x, y), radius = cv2.minEnclosingCircle(c)
if y > 24 and (x < 498 and x > 20):
if abs((y-290)/(x-22)) < 1.7 or y > 290:
if s < 45:
#x,y,w,h = cv2.boundingRect(c)
(x,y),radius = cv2.minEnclosingCircle(c)
center = (int(x),int(y-radius))
radius = int(radius)
img = cv2.circle(img,center,radius,(x,s,y),5)
#cv2.rectangle(img, (x, y), (x+w , y - h), (x+h, w+y, y+x), 5)
cv_show('img',img)
在查找过程中,因为有很多的噪音点,试了很多的办法,最后只能用了斜率的方法给解决了,真的是服气我自己 哈哈