opencv 小结 【乙】
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.
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()
-
k=np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]) #二维数组
-
kWhere=np.where(a>3)
-
print(kWhere)
-
print(k[kWhere])
-
(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')
更多推荐
所有评论(0)