提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、边缘保留滤波(EPF)
高斯模糊只考虑了权重,只考虑了像素空间的分布,没有考虑像素值和另一个像素值之间差异的问题,如果像素间差异较大的情况下(比如图像的边缘),高斯模糊会进行处理,但是我们不需要处理边缘,要进行的操作就叫做边缘保留滤波(EPF)
代码如下(示例):
import cv2 as cv
def bi_demo(image):
dst = cv.bilateralFilter(image, 0, 100, 15) #100要大一点 15要小一点
cv.imshow("bi_demo",dst)
def shift_demo(image):
dst = cv.pyrMeanShiftFiltering(image, 10, 50) #均值迁移
cv.imshow("shift_demo",dst)
src=cv.imread("D:\\12345.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
bi_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
二、图像二值化
图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。
1.全局阙值
代码如下(示例):
import cv2 as cv
import numpy as np
def threshold_demo(image): # 全局阈值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #将图像变为灰路图像
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #自动寻找阈值,
#ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY ) #自定义阈值 , 自定义阙值要把 |后面删除
print("threshold value %s"%ret) #输出阈值
cv.imshow("binary",binary)
src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
threshold_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
2.局部阙值
代码如下(示例):
import cv2 as cv
import numpy as np
def local_threshold(image): # 局部阈值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10) # 25的位置必须是奇数 25 和 10可以改变
cv.imshow("binary",binary)
src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
local_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()
3.自定义阙值
import cv2 as cv
import numpy as np
def custom_threshold(image): #自定义阙值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
h, w = gray.shape[:2]
m = np.reshape(gray,[1, w+h])
mean = m.sum() / (w+h)
print("maen : ",mean)
ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
cv.imshow("binary",binary)
src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
custom_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()
三、Canny边缘提取
import cv2 as cv
import numpy as np
def edge_demo(image):
blurred = cv.GaussianBlur(image, (3, 3), 0) # 高斯模糊
gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY) # 灰路图像
xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0) # xGrodient
ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1) # yGrodient
edge_output = cv.Canny(xgrad, ygrad, 50, 150) # edge
cv.imshow("Canny Edge",edge_output)
# 彩色边缘
dst = cv.bitwise_and(image, image, mask=edge_output)
cv.imshow("Color Edge", dst)
src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
总结
以上就是今天所学的内容。
鸣谢
https://blog.csdn.net/u012308586/article/details/92795767
https://blog.csdn.net/qq_36783848/article/details/88553617