图像平滑
'''
随机出现的白点或黑点
'''
'''
各种灰度值的点都有
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
imgjz=cv.imread("opencv_2.png")
imggs=cv.imread("opencv_2.png")
jz=cv.blur(imgjz,(5,5))
cv.imshow("jz",jz)
'''
计算权重矩阵(权重类似于正态分布,靠近中心像素的权重高于远离的)
'''
blur=cv.GaussianBlur(imggs ,(3,3),1)
cv.imshow("gs",blur)
zz=cv.medianBlur(imggs,3)
cv.imshow("zz",zz)
cv.waitKey(0)
不同的噪声处理得到的图像的清晰度不相同,但好像都不太清晰
图像金字塔
import numpy as np
import cv2 as cv
img=cv.imread("opencv_2.png")
up_img=cv.pyrUp(img)
img_1=cv.pyrDown(img)
cv.imshow("enlarge",up_img)
cv.imshow("orinigal",img)
cv.imshow("shrink",img_1)
cv.waitKey(0)
cv.destroyAllWindows()
图像上或下采样取大小不同
开闭运算
开闭运算(不可逆) ‘’’ 开运算:先腐蚀后膨胀,分离物体,消除小区域, 消除噪点,去除小的干扰块,而不影响原来的图像 闭运算:与开运算相反 可以填充闭合区域
‘’’
'''
开运算:先腐蚀后膨胀,分离物体,消除小区域,
消除噪点,去除小的干扰块,而不影响原来的图像
闭运算:与开运算相反
可以填充闭合区域
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1=cv.imread("opencv_1.png")
img2=cv.imread("opencv_2.png")
kernel2=np.ones((10,10),np.uint8)
cvOpen=cv.morphologyEx(img1,cv.MORPH_OPEN,kernel2)
cvClose=cv.morphologyEx(img2,cv.MORPH_CLOSE,kernel2)
cv.imshow("1",cvOpen)
cv.imshow("2",cvClose)
plt.show()
top=cv.morphologyEx(cvOpen,cv.MORPH_TOPHAT,kernel2)
cv.imshow("礼帽运算",top)
black=cv.morphologyEx(cvClose,cv.MORPH_BLACKHAT,kernel2)
cv.imshow("黑帽运算",black)
cv.waitKey(0)
形态学操作
邻域 #连通性
‘’’ 4邻域:像素p(x,y)的4邻域:(x,y+1)(x,y-1)(x+1,y)(x-1,y) D邻域:(x+1,y+1)(x+1,y-1)(x-1,y+1)(x-1,y-1) 8邻域:4邻域+D邻域
‘’’ #腐蚀和膨胀(针对白色部分而言) ‘’’
腐蚀:高亮区域蚕食,求局部最小值 结构A被结构B腐蚀:A、B之间每个像素点 ”与“ 的结果给A 膨胀:使图像的高亮区域扩张,求局部最大值 ”或“ ‘’’
'''
4邻域:像素p(x,y)的4邻域:(x,y+1)(x,y-1)(x+1,y)(x-1,y)
D邻域:(x+1,y+1)(x+1,y-1)(x-1,y+1)(x-1,y-1)
8邻域:4邻域+D邻域
'''
'''
腐蚀:高亮区域蚕食,求局部最小值
结构A被结构B腐蚀:A、B之间每个像素点 ”与“ 的结果给A
膨胀:使图像的高亮区域扩张,求局部最大值
”或“
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread("opencv_2.png")
kernel=np.ones((5,5),np.uint8)
erosion=cv.erode(img,kernel)
dilate=cv.dilate(img,kernel)
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(img)
axes[0].set_title("原图")
axes[1].imshow(erosion)
axes[1].set_title("腐蚀后的结果")
axes[2].imshow(dilate)
axes[2].set_title("膨胀后的结果")
plt.show()
掩膜
用选定的图像、或物体,对处理的图像进行遮挡,来控制图像的处理区域
'''
用选定的图像、或物体,对处理的图像进行遮挡,来控制图像的处理区域
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread("opencv_2.png",0)
mask=np.zeros(img.shape[:2],np.uint8)
mask[400:650,200:500]=255
mask_img=cv.bitwise_and(img,img,mask=mask)
mask_histr=cv.calcHist([img],[0],None,[256],[1,256])
plt.plot(mask_histr)
cv.imshow("mask",mask)
cv.imshow("mask_img",mask_img)
cv.waitKey(0)
模板匹配与霍夫变换
在给定的图片中查找和模板相似的区域,最终将匹配最高的区域选择为最终的结果
'''
在给定的图片中查找和模板相似的区域,最终将匹配最高的区域选择为最终的结果
'''
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img=cv.imread("opencv_2.png")
template=cv.imread("opencv_3.png")
h,w,l=template.shape
res=cv.matchTemplate(img,template,cv.TM_CCORR)
min_val,max_val,min_loc,max_loc=cv.minMaxLoc(res)
top_left=max_loc
bottom_right=(top_left[0]+w,top_left[1]+h)
cv.rectangle(img,top_left,bottom_right,(0,255,0),2)
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'),plt.xticks([]),plt.yticks([])
plt.show()
灰度直方图
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread("opencv_2.png")
cv.imshow("1",img)
cv.waitKey(0)
hist=cv.calcHist([img],[0],None,[256],[0,256])
plt.figure(figsize=(10,8))
plt.plot(hist)
plt.show()
边缘检测
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img=cv.imread("opencv_2.png",0)
x=cv.Sobel(img,cv.CV_16S,1,0)
y=cv.Sobel(img,cv.CV_16S,0,1)
x2=cv.Sobel(img,cv.CV_16S,1,0,ksize=-1)
y2=cv.Sobel(img,cv.CV_16S,0,1,ksize=-1)
Scale_absX=cv.convertScaleAbs(x)
Scale_absy=cv.convertScaleAbs(y)
Scale_absX2=cv.convertScaleAbs(x2)
Scale_absy2=cv.convertScaleAbs(y2)
result=cv.addWeighted(Scale_absX,0.5,Scale_absy,0.5,0)
result2=cv.addWeighted(Scale_absX2,0.5,Scale_absy2,0.5,0)
res=cv.Laplacian(img,cv.CV_16S)
res=cv.convertScaleAbs(res)
plt.imshow(res,cmap=plt.cm.gray)
plt.show()
Canny边缘检测
'''
1:噪声去除
2:计算图像梯度
3:非极大值抑制
'''
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img=cv.imread("opencv_2.png",0)
lowThreshold=0
max_lowThreshold=100
canny=cv.Canny(img,lowThreshold,max_lowThreshold)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title("原图")
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(canny,cmap=plt.cm.gray),plt.title("Canny")
plt.xticks([]),plt.yticks([])
plt.show()
|