????????OpeanCV是一个开源的计算机视觉和机器学习软件库。它由一系列的C函数和少量C++类构成,同时提供Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。在此将从基础功能开始介绍OpeanCV。
边界填充是指对待处理的图片边界进行扩充,下面列出一些常用的填充效果。
# cv2.BORDER_CONSTANT:添加的边界框像素值为常数(自行给出)
# cv2.BORDER_REFLECT:添加的边界框为边界像素的镜面反射如dcba|abcdefg|gfed
# cv2.BORDER_REFLECT_101或者cv2.BORDER_DEFAULT:与上面类似但有区别如dcb|abcdefg|fed(临近的一个不会映射)
# cv2.BORDER_REPLICATE:使用最边界的像素值代替如aaaaa|abcdefg|gggggg
# cv2.BORDER_WRAP:左右两边替代如abcdefg|abcdefg|abcdefg
我们以第四种为列进行效果展示,读者可以自行修改代码学习其他填充效果
a=cv2.imread('tiaowen.jpg') #替换成自己的图片,注意图片要放到代码文件同文件夹下
top,bottom,left,right=50,50,50,50 #填充域
a=cv2.copyMakeBorder(a,top,bottom,left,right,cv2.BORDER_REPLICATE)
cv2.imshow('123',a)
cv2.waitKey(00) #等待时间
cv2.destroyAllWindows()
阈值处理通常会设定一个阈值,通过阈值将图像的像素划分为两类:大于阈值的像素和小于阈值的像素。灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。二值化处理可以将图像中的像素划分为两类颜色。常用效果如下
# 选项 像素值>thresh 其他情况
# cv2.THRESH_BINARY maxval 0 大于thresh就变成maxval
# cv2.THRESH_BINARY_INV 0 maxval 与上述相反
# cv2.THRESH_TRUNC thresh 当前灰度值 大于thresh就变成thresh
# cv2.THRESH_TOZERO 当前灰度值 0 大于thresh不变其他设为0
# cv2.THRESH_TOZERO_INV 0 当前灰度值 与上述相反
我们需要用到cv2.threshold(src,thresh,maxval,type): #src代表要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值 #thresh代表要设定的阈值 #maxval代表type参数位THRESH_BINARY或者THRESH_BINARY_INV类型时需要设定的最大值 #type代表阈值分割的类型
下面展示所有效果(第一个为灰度图,阈值处理是在灰度图的基础上进行的!!!)
代码如下,大家可以自己调整参数观察变化,理解不同操作的含义
image=cv2.imread('car.jpg',cv2.IMREAD_GRAYSCALE)#灰度图
image=cv2.resize(image,(800,500))
cv2.imshow('hui',image)
cv2.waitKey(0) #0表示等你键入任意键
ret, binary=cv2.threshold(image,140,80,cv2.THRESH_BINARY)
cv2.imshow('binary',binary)
cv2.waitKey(0)
ret1,binaryinv=cv2.threshold(image,140,230,cv2.THRESH_BINARY_INV)
cv2.imshow('binaryinv',binaryinv)
cv2.waitKey(0)
ret2,trunc=cv2.threshold(image,180,200,cv2.THRESH_TRUNC)
cv2.imshow('trunc',trunc)
cv2.waitKey(0)
ret3,tozero=cv2.threshold(image,120,255,cv2.THRESH_TOZERO)
cv2.imshow('tozero',tozero)
cv2.waitKey(0)
ret4,tozeroinv=cv2.threshold(image,100,200,cv2.THRESH_TOZERO_INV)
cv2.imshow('tozeroinv',tozeroinv)
cv2.waitKey(0)
图像平滑处理可以帮助我们消除一些图像的噪声点,帮助我们恢复图像。常有的方法如下:
# 均值滤波
# jun=cv2.blur(src,ksize,anchor,borderType)
# jun 返回值
# src 文件名称
# ksize 滤波核(卷积核)的大小
# anchor 锚点,默认值(-1,-1)一般无需改动
# borderType 边界样式,一般无需改动
# 方框滤波
# box=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
# ddepth 处理结果的图像深度,一般使用-1表示与原始图像相同的图像深度
# normalize 表示滤波时是否进行归一化
# 高斯滤波
# gauss=cv2.GaussianBlur(src,ksize[,sigmaX[,sigmaY[,dst]]])
# sigmaX sigmaY表示在x轴y轴上的标准差,这些值与滤波器大小相同。默认为0
# dst 输出图像,通常是一个numpy数组,如果为NONE则会创建一个新的数组来存储结果
#中值滤波
# meida=cv2.medianBlur(src,ksize[,dst])
# dst 输出图像,通常是一个numpy数组,如果为NONE则会创建一个新的数组来存储结果
关于集中滤波的详细介绍推荐阅读:
数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)_高斯滤波,均值滤波,中值滤波-CSDN博客
方框滤波:方框滤波(Box filtering)-CSDN博客?
效果展示
完整代码如下?
需要生成噪声图的可以观看下面的博客:
noise=cv2.imread('cai_zao.jpg') #读取你的噪声图
cv2.imshow('zao',noise)
# 均值滤波
# jun=cv2.blur(src,ksize,anchor,borderType)
# jun 返回值
# src 文件名称
# ksize 滤波核(卷积核)的大小
# anchor 锚点,默认值(-1,-1)一般无需改动
# borderType 边界样式,一般无需改动
blur_1=cv2.blur(noise,(9,9))
cv2.imshow('blur',blur_1)
# cv2.waitKey(0)
# 方框滤波
# box=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
# ddepth 处理结果的图像深度,一般使用-1表示与原始图像相同的图像深度
# normalize 表示滤波时是否进行归一化
boxFilter =cv2.boxFilter(noise,-1,(9,9),normalize=True)
cv2.imshow('boxFilter',boxFilter)
# cv2.waitKey(0)
# 高斯滤波
# gauss=cv2.GaussianBlur(src,ksize[,sigmaX[,sigmaY[,dst]]])
# sigmaX sigmaY表示在x轴y轴上的标准差,这些值与滤波器大小相同。默认为0
# dst 输出图像,通常是一个numpy数组,如果为NONE则会创建一个新的数组来存储结果
gaus=cv2.GaussianBlur(noise,(9,9),1)
cv2.imshow('GaussianBlur',gaus)
# cv2.waitKey(00)
#中值滤波
# meida=cv2.medianBlur(src,ksize[,dst])
# dst 输出图像,通常是一个numpy数组,如果为NONE则会创建一个新的数组来存储结果
medianBlur=cv2.medianBlur(noise,9)
cv2.imshow('medianBlur',medianBlur)
cv2.waitKey(0)
?对于效果不满意的可以修改自己的卷积核大小。