Canny    边缘检测

1, 使用高斯滤波器,以平滑图像,消除噪声

2, 计算图像中每个像素点的梯度大小与方向

3, 使用  非极大值抑制

4, 双阈值检测        大于maxval保留,小于minval舍弃,之间的  只与大于maxval连接的

cv2.Canny(图片,minval,maxval)

im=cv2.imread(r'C:\Users\hk\Desktop\opencv\img\1 (14).jpg',cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(im,50,150)
v2=cv2.Canny(im,140,150)
v3=cv2.Canny(im,60,200)
v4=cv2.Canny(im,60,80)

plt.figure(figsize=(30,15))
plt.subplot(221),plt.imshow(v1,'gray'),plt.title('50 150')
plt.subplot(222),plt.imshow(v2,'gray'),plt.title('140 150')
plt.subplot(223),plt.imshow(v3,'gray'),plt.title('60 200')
plt.subplot(224),plt.imshow(v4,'gray'),plt.title('60 80')
plt.show()

 

金字塔

高斯金字塔 

cv2.pyUp(图片)        将图片size变大

cv2.pyrDown(图片)  将图片size变小

 

im=cv2.imread(r'C:\Users\hk\Desktop\opencv\img\1 (32).jpg',cv2.IMREAD_GRAYSCALE)

up=cv2.pyrUp(im)
down=cv2.pyrDown(im)
plt.figure(figsize=(30,15))
plt.subplot(221),plt.imshow(up,'gray'),plt.title('up')
plt.subplot(222),plt.imshow(im,'gray'),plt.title('im')
plt.subplot(223),plt.imshow(down,'gray'),plt.title('down')

plt.show()

注意尺寸

 up

dowm

 

拉普拉斯金字塔

im=cv2.imread(r'C:\Users\hk\Desktop\opencv\img\1 (32).jpg',cv2.IMREAD_GRAYSCALE)

down=cv2.pyrDown(im)
downUp=cv2.pyrUp(down)

plt.imshow((im-downUp),'gray')

图像轮廓

 cv2.findContours(图片,模式,方法) 返回图像轮廓       返回:轮廓,层     

【          图片必须是单通道图像      】   

cv2.drawContours(图片,轮廓,轮廓索引,(b,g,r)线条颜色,线条宽度)根据轮廓描边

模式:

RETR_EXTERNAL        只检索最外面轮廓

RETR_LIST                    检索所有轮廓,保存到链表中

RETR_CCOMP             检索所有轮廓,分为两层,顶层是各部分的外部边界,第二层 空洞的边界

RETR_TREE                检索所有轮廓,并重构嵌套轮廓的整个层次

方法:

CHAIN_APPROX_NONE         以Freeman连码的方式输出轮廓

CHAIN_APPROX_SIMPEL        只保留终点

im=cv2.imread(r'C:\Users\hk\Desktop\opencv\img\1 (32).jpg')
gray=cv2.cvtColor(im,cv2.IMREAD_GRAYSCALE)

ret,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(thresh[:,:,0],cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
im0=im.copy()
out=cv2.drawContours(im0,contours,-1,(255,0,0),1)

cv_show('',out)

轮廓特征

 cv2.contourArea(轮廓)        计算面积

cv2.arcLength(轮廓,是否闭合)计算长度

im=cv2.imread(r'C:\Users\hk\Desktop\opencv\0.png')
gray=cv2.cvtColor(im,cv2.IMREAD_GRAYSCALE)

ret,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(thresh[:,:,0],cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
im0=im.copy()
im1=im.copy()
im2=im.copy()
out=cv2.drawContours(im0,contours,-1,(255,0,0),2)
out1=cv2.drawContours(im1,contours,0,(255,0,0),5)
out2=cv2.drawContours(im2,contours,1,(255,0,0),5)

plt.figure(figsize=(15,15))
plt.subplot(221),plt.imshow(im[:,:,[2,1,0]]),plt.title('im')
plt.subplot(222),plt.imshow(out[:,:,[2,1,0]]),plt.title('out')
plt.subplot(223),plt.imshow(out1[:,:,[2,1,0]]),plt.title('out1')
plt.subplot(224),plt.imshow(out2[:,:,[2,1,0]]),plt.title('out2')

plt.show()

print(cv2.contourArea(contours[0]))
print(cv2.contourArea(contours[1]))
print(cv2.arcLength(contours[0],True))
print(cv2.arcLength(contours[1],True))
print(cv2.arcLength(contours[1],False))
69967.0
1198.0
990.4894571304321
1202.0
1201.0
轮廓近似

cv2.approxPolyDP(轮廓,精度,布尔值)        返回轮廓近似.

img=cv2.imread(r'C:\Users\hk\Desktop\opencv\o.png')
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\o.png',cv2.IMREAD_GRAYSCALE)

ret,thresh=cv2.threshold(im,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

epsilon=0.001*cv2.arcLength(contours[1],True)
approx=cv2.approxPolyDP(contours[1],epsilon,True)

img0=img.copy()
res=cv2.drawContours(img0,[approx],-1,(255,0,0),2)

cv_show('',res)

0.001*cv2.arcLength(contours[1],True)

epsilon=0.01*cv2.arcLength(contours[1],True) 

 0.04*cv2.arcLength(contours[1],True)

边界矩形

x,y,w,h=cv2.boundingRect(contours[1])

res=cv2.rectangle(img0,(x,y)左上顶点,(x+w,y+h)右下点,(0,255,0),1)

img=cv2.imread(r'C:\Users\hk\Desktop\opencv\o.png')
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\o.png',cv2.IMREAD_GRAYSCALE)

ret,thresh=cv2.threshold(im,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

x,y,w,h=cv2.boundingRect(contours[1])
img0=img.copy()
res=cv2.rectangle(img0,(x,y),(x+w,y+h),(0,255,0),1)

cv_show('',res)

边界圆

(x,y),radius=cv2.minEnclosingCircle(contours[1])

center=(int(x),int(y))

res=cv2.circle(img0,center,int(radius),(0,255,0),1)

img=cv2.imread(r'C:\Users\hk\Desktop\opencv\o.png')
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\o.png',cv2.IMREAD_GRAYSCALE)

ret,thresh=cv2.threshold(im,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

(x,y),radius=cv2.minEnclosingCircle(contours[1])
center=(int(x),int(y))
img0=img.copy()
res=cv2.circle(img0,center,int(radius),(0,255,0),1)

cv_show('',res)

模板匹配

原始图像大小:X*Y         模板大小:x*y        输出大小:(X-x+1)*(Y-y+1)       

TM_SQDIFF                        计算平方不同,越小越相关

TM_CCORR                        计算相关性,越大越相关

TM_CCOEFF                       计算相关系数,越大越相关

TM_SQDIFF_NORMED       计算归一化平方不同,越接近0越相关

TM_CCORR_NORMED       计算归一化相关性,越接近1越相关  

TM_CCOEFF_NORMED     计算归一化相关系数,越接近1越相关   

res=cv2.matchTemplate(图片,模板,方法)

minVal,maxVal,minLoc,maxLoc=cv2.minMaxLoc(res)

获取脸部照片

 

imgn=img[50:380,950:1230,:]
cv_show('',imgn)
cv2.imwrite(r'C:\Users\hk\Desktop\opencv\face.jpg',imgn)
methods=['cv2.TM_SQDIFF','cv2.TM_CCORR','cv2.TM_CCOEFF','cv2.TM_SQDIFF_NORMED','cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF_NORMED']
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\mm.jpg',cv2.IMREAD_GRAYSCALE)
img=cv2.imread(r'C:\Users\hk\Desktop\opencv\mm.jpg')
face=cv2.imread(r'C:\Users\hk\Desktop\opencv\face.jpg',cv2.IMREAD_GRAYSCALE)
h,w=face.shape[:2]

for i in methods:
    img0=im.copy()
    res=cv2.matchTemplate(im,face,eval(i))
    minVal,maxVal,minLoc,maxLoc=cv2.minMaxLoc(res)
    
    if i in ['cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']:
        top=minLoc
    else:
        top=maxLoc
    
    bottomRight=(top[0]+w,top[1]+h)
    cv2.rectangle(img0,top,bottomRight,(255,0,0),2)
    
    plt.figure(figsize=(20,20))
    plt.subplot(121),plt.imshow(res,'gray'),plt.axis('off')
    plt.subplot(122),plt.imshow(img0,cmap='gray'),plt.axis('off')
    plt.suptitle(i)
    plt.show()

 

 

 

 

 

 

匹配多个对象

np.where() 

  1. k=np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]])  #二维数组

  2. kWhere=np.where(a>3)

  3. print(kWhere)

  4. print(k[kWhere])

  5. (array([0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3], dtype=int64), array([3, 4, 2, 3, 4, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))
    [4 5 4 5 6 4 5 6 7 4 5 6 7 8]

zip(*zipped)

a=[1,2,3]
b=[4,5,6]
list(zip(*[a,b]))

methods=['cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF_NORMED']
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\p.jpg',cv2.IMREAD_GRAYSCALE)
img=cv2.imread(r'C:\Users\hk\Desktop\opencv\p.jpg')
face=cv2.imread(r'C:\Users\hk\Desktop\opencv\pface.jpg',cv2.IMREAD_GRAYSCALE)
h,w=face.shape[:2]

res=cv2.matchTemplate(im,face,eval(methods[0]))

loc=np.where(res>=0.98)
img0=im.copy()
print(len(list(zip(*loc))))
for i in zip(*loc):

    bottomRight=(i[1]+w,i[0]+h)
    cv2.rectangle(img,(i[1],i[0]),bottomRight,(255,0,0),2)


cv_show('',img)

直方图

cv2.calcHist(图片集,channels,mssk,histSize,ranges)

channels:[0]        对应灰度图        [0,1,2] 对应 r g b

mask:   掩模图像,统计整幅图的直方图设为None

histSize: BIN数量,用中括号括起开;指直方图柱子个数

ranges:像素值范围,[0,255]

img=cv2.imread(r'C:\Users\hk\Desktop\opencv\m.jpg')
color=['b','g','r']

for i in range(3):
    hist=cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(hist,color[i]+'-')
plt.show()

 

img=cv2.imread(r'C:\Users\hk\Desktop\opencv\m.jpg',0)
cv_show('',img)
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.hist(img.ravel(),256)
plt.show()

 

plt.plot(hist,'k')

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐