一天撸完Python-Opencv常用函数和基本思想(续集)

1 形态学转换
在这里插入图片描述
形态学操作是根据图像形状进行的简单操作。
一般情况下对二值化图像进行操作。需要输入两个参数,一个原始图像,第二个被称为结构化元素或核,它是用来操作的性质的。两个基本的形态学操作是腐蚀核膨胀。
他们的变体构成了开运算,闭运算,梯度等。

1.1 腐蚀
就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为零。
这回产生什么影响呢?根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小,整幅图像的白色区域会减少。**这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。**这里我们有一个例子,使用一个5x5的卷积核,其中所有的值都是以。让我们看看他是如何工作的:

看看代码:

img = cv2.imread("erode.png",0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
erosion = cv2.resize(erosion, (320, 320), interpolation=cv2.INTER_CUBIC)#由于图像太小,这里使用放大一下
cv2.imshow("erode",erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个是原图:
在这里插入图片描述

这个是腐蚀后的图像
在这里插入图片描述
1.2 膨胀
与腐蚀相反,与卷积核对应的原图像的像素值中只有一个是1,中心元素的像素值就是1,。所以这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。这时噪声已经被取出来,不会再回来了,但是前景还在并会增加。
膨胀也可以用来连接两个分开的物体。
下面分别是原图,腐蚀,腐蚀后膨胀的图像,代码如下:

img = cv2.imread("erode.png",0)
kernel = np.ones((5,5),np.uint8)
img = cv2.resize(img, (320, 320), interpolation=cv2.INTER_CUBIC)
cv2.imshow("img",img)
erosion = cv2.erode(img,kernel,iterations=1)
erosion = cv2.resize(erosion, (320, 320), interpolation=cv2.INTER_CUBIC)
cv2.imshow("erode",erosion)
dilation = cv2.dilate(erosion,kernel,iterations=1)
cv2.imshow("dilation",dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
先腐蚀在膨胀的运算叫做开运算
函数是cv2.morphologyEx()
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

闭运算
先膨胀在腐蚀,它经常用来填充前景物体中的小洞,或者前景物体上的小黑点。

img = cv2.imread("closing.png",0)
kernel = np.ones((9,9),np.uint8)
img = cv2.resize(img, (320, 320), interpolation=cv2.INTER_CUBIC)
cv2.imshow("img",img)
# erosion = cv2.erode(img,kernel,iterations=1)
# erosion = cv2.resize(erosion, (320, 320), interpolation=cv2.INTER_CUBIC)
# cv2.imshow("erode",erosion)
# dilation = cv2.dilate(erosion,kernel,iterations=1)
# cv2.imshow("dilation",dilation)
opening = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv2.imshow("opening",opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
1.3 形态学梯度
其实就是一幅图像膨胀与腐蚀的差别
在这里插入图片描述
其实形态学就是原图像膨胀与原图像腐蚀做差后的结果


图像梯度
2 图像梯度,图像边界等
使用到的函数有:从cv2.Sobel(), cv2.Schar(), cv2.Laplacian()等
Sobel、Schar其实就是求一届或二阶导数
Scharr:当内核大小为3时, 以上Sobel内核可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了 Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,不怕干扰,其内核为:
Scharr

2.1 Laplacian算子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

img = cv2.imread("erode.png",1)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)

plt.subplot(2,2,1),plt.imshow(img,cmap='gray')
plt.title('original'),plt.xticks([]),plt.yticks([])

plt.subplot(2,2,2),plt.imshow(laplacian,cmap='gray')
plt.title('laplacian'),plt.xticks([]),plt.yticks([])

plt.subplot(2,2,3),plt.imshow(sobelx,cmap='gray')
plt.title('sobelx'),plt.xticks([]),plt.yticks([])

plt.subplot(2,2,4),plt.imshow(sobely,cmap='gray')
plt.title('sobely'),plt.xticks([]),plt.yticks([])

plt.show()

在这里插入图片描述
在这里插入图片描述
2.2 Canny边缘检测
由于边缘信息很容易受到噪声的影响,所以第一步是使用5X5的高斯滤波器去除噪声。

img = cv2.imread("pic.png",0)
edges = cv2.Canny(img,100,180)

plt.subplot(121),plt.imshow(img,cmap='gray')
plt.title('original image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap='gray')
plt.title('edges image'),plt.xticks([]),plt.yticks([])

plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
3 图像金字塔
在这里插入图片描述
使用金字塔进行图像融合
一下是教材上的例子:

在这里插入图片描述
步骤:
在这里插入图片描述
4 直方图

import  numpy as np
import matplotlib.pyplot as plt
import  cv2

# 1读取两幅图像
A = cv2.imread("Apple.png",0)
plt.hist(A.ravel(),256,[0,256])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

A = cv2.imread("Apple.png",0)
plt.hist(A.ravel(),256,[0,256])
equ = cv2.equalizeHist(A)
res = np.hstack((A,equ))
cv2.imshow("hist",res)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

内容还是很多的,由于时间关系,就到这里,谢谢各位!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页