目录
一、形态学
二、图像全局二值化
三、自适应阈值二值化
四、腐蚀操作
五、获取形态学卷积核
六、膨胀操作
七、开运算
八、闭运算
一、形态学
定义:
- 指一系列处理图像形状特征的图像处理技术
- 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或0特征,以便进一步进行图像分析和目标识别。
- 这些处理方法基本是对二进制图像进行处理即黑白图像
- 卷积核决定着图像处理后的效果
二、图像全局二值化
二值化:将图像的每个像素变成两种值,比如0,255
参照函数:
案例代码如下:
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 二值化是对灰度图像操作
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 注意,threshold会返回两个值(一个是阈值,一个是二值化处理后的图片)
thresh,dst = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
# 展示
cv2.imshow('dog',np.hstack((gray,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
三、自适应阈值二值化
前提:
在前面的部分我们使用是全局闻值,整幅图像采用同一个数作为闻值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应闻值。此时的闻值是根据图像上的每一个小区域计算与其对应的闻值。因此在同一幅图像上的不同区域采用的是不同的闻值,从而使我们能在亮度不同的情况下得到更好的结果
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg')
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',1920,1080)
# 二值化操作是对灰度图像操作,把图像转为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 自适应阈值二值化只返回一个值,即二值化后的结果
dst = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,3,0)
# 展示
cv2.imshow('img',np.hstack((gray,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
四、腐蚀操作
腐蚀操作也是用卷积核扫描图像,只不过腐蚀操作的卷积和一般都是1,如果卷积核内所有像素点都是白色,那么锚点也是白色。
腐蚀操作API:
案例代码如下:
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 定义核
kernel = np.ones((3,3),np.uint8)
dst = cv2.erode(img,kernel,iterations=2)
cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyWindow()
五、获取形态学卷积核
OpenCv提供了获取卷积核的API,不需要我们手工创建卷积核
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 腐蚀
dst = cv2.erode(img,kernel,iterations=2)
六、膨胀操作
膨胀是腐蚀的相反操作,基本原理是只要保证卷积核的锚点是非0值,周边无论是0还是非0值,都变成非0 值
案例代码如下:
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 动态获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 膨胀操作
dst = cv2.dilate(img,kernel,iterations=1)
# 展示图片
cv2.imshow('img',np.hstack((img,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
七、开运算
开运算=腐蚀+膨胀
案例代码如下:
import cv2
import numpy as np
# 开运算=腐蚀+膨胀
# 开运算提供了另一种去除噪声的思路
img = cv2.imread('6.jpg')
kernel = cv2.cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# # 先腐蚀
# dst = cv2.erode(img,kernel,iterations=2)
#
# # 膨胀
# dst = cv2.dilate(dst,kernel,iterations=2)
# 直接调用OpenCv提供的开运算API
dst = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=2)
# 展示图片
cv2.imshow('img',np.hstack((img,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下:
八、闭运算
闭运算=膨胀+腐蚀
案例代码如下:
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 闭运算
dst = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=2)
# 展示图片
cv2.imshow('img',np.hstack((img,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()