大家好,又见面了,我是你们的朋友全栈君。
1.opencv中滤波操作:ksize必须是奇数
1.均值操作:选定图像上的行数和列数,求出总和,除以总个数,然后将这个数放到这个选定区的中间区域中。数学表达式:4上的值=(5+6+6+7+4+.....+55)/25;
函数:result=cv2.blur(src,ksize)
import cv2
o=cv2.imread('D:\cc1\lenacolor.png')#进行图片的读取
s1=cv2.blur(o,(10,10))#进行均值操作
cv2.imshow('oringle',o)#进行图片显示
cv2.imshow("result",s1)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
2方框滤波:
函数:result=cv2.boxFliter(src,ddepth,ksize,normalize),在这个用法中ddpeth一般设置为-1,
计算方法:
import cv2
o=cv2.imread('D:\cc1\lenacolor.png')
s1=cv2.boxFilter(o,-1,(4,4),normalize=0)#这种情况容易溢出
s2=cv2.boxFilter(o,-1,(4,4),normalize=1)#相当于均值滤波
cv2.imshow('oringinal',o)
cv2.imshow('result_0',s1)
cv2.imshow('result_1',s2)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
3.高斯滤波:让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。
函数:result=cv2.Gaussian(src,ksize,sigmaX)
其中sigmaX:X 方向方差,控制权重
sigmaX=0时,sigma=0.3*(ksize-1)*0.5-1)+0.8
import cv2
o=cv2.imread('D:\cc1\lenacolor.png')
s2=cv2.GaussianBlur(o,(5,5),sigmaX=0,sigmaY=0)#x方向和y方向的权重
s3=cv2.GaussianBlur(o,(5,5),sigmaX=0)#x方向权重
cv2.imshow('original',o)
cv2.imshow('xy',s2)
cv2.imshow('x',s3)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
4.中值滤波:让ksize中的数据按照像素大小进行排列,取排序像素中间的值作为中值滤波的像素值:
函数:cv2.mediablur(src,ksize)
import cv2
o=cv2.imread('D:\cc1\lenacolor.png')
s1=cv2.medianBlur(o,11)#这个11代表11行11列
cv2.imshow('oringial',o)
cv2.imshow('result',s1)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
## 2.opencv中形态处理:
1. 腐蚀操作:被操作的对象必须是二值图像;两个操作对象:一个是原始图像,另一个是卷积核;操作过程:被扫描到的原始图像中的像素点,只有当卷积核扫描图像中所有元素值均为1时,其值才为1,否则值为0;函数:result=cv2.erode(src,kernerl,iternation)
import cv2
import numpy as np
o=cv2.imread('D:/cc1/erode.bmp',cv2.IMREAD_UNCHANGED)
k1=np.ones((4,4),np.uint8)#创建一个4行4列的二维数组
s1=cv2.erode(o,k1)#默认进行一次迭代,
s2=cv2.erode(o,k1,iterations=5)#进行5次迭代
cv2.imshow('original',o)#显示原始图像
cv2.imshow('iter_1',s1)#显示迭代一次图像
cv2.imshow('iter_5',s2)#显示迭代5次图像
cv2.waitKey()
cv2.destroyAllWindows()
结果为
通过结果我们可以发现随着迭代次数的增多,图像噪声被清除,但是图像大小越来越小
2.膨胀::被操作的对象必须是二值图像;两个操作对象:一个是原始图像,另一个是卷积核;操作过程:被扫描到的原始图像中的像素点,只有当卷积核扫描图像中所有元素值均为0时,其值才为1,否则值为1;函数:result=cv2.dilate(src,kernerl,iternation)
import cv2
import numpy as np
o=cv2.imread('D:/cc1/dilation.bmp',cv2.IMREAD_UNCHANGED)#读取过程中不改变图片的类型
k1=np.ones((5,5),np.uint8)
s1=cv2.dilate(o,k1)
s2=cv2.dilate(o,k1,iterations=8)
cv2.imshow('oringinal',o)
cv2.imshow('iter_1',s1)
cv2.imshow('iter_9',s2)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
3.开运算:先对图像进行腐蚀操作,然后再进行膨胀操作,这样不仅可以去除噪声,并且可以保持图形形状不改变。基本公式:开运算(image)=膨胀(腐蚀(image));函数:result=cv2.morphologyEx(src,cv2.MORPH_OPEN,kernel)其中kernel是卷积核。主要使用于图像外面有噪声
import cv2
import numpy as np
o=cv2.imread('D:/cc1/opening.bmp',cv2.IMREAD_UNCHANGED)
k1=np.ones((4,4),np.uint8)#创建卷积核
s1=cv2.morphologyEx(o,cv2.MORPH_OPEN,k1)#迭代一次
s2=cv2.morphologyEx(o,cv2.MORPH_OPEN,k1,iterations=8)#迭代8次
cv2.imshow('oringinal',o)
cv2.imshow('iter_1',s1)
cv2.imshow('iter_2',s2)
cv2.waitKey()
cv2.destroyAllWindows()
4闭运算:先进性膨胀操作,在进行腐蚀操作,主要使用于图像内容有噪声:函数表达式:result=cv2.morphologyEx(src,cv2.MORPH_CLOSE,kernel)其中kernel是卷积核
import cv2
import numpy as np
o=cv2.imread('D:/cc1/closing.bmp',cv2.IMREAD_UNCHANGED)#读取图片,并保持图片格式不改变
k1=np.ones((4,4),np.uint8)#创建一个卷积核
s1=cv2.morphologyEx(o,cv2.MORPH_CLOSE,k1)#进行一次迭代闭运算
s2=cv2.morphologyEx(o,cv2.MORPH_CLOSE,k1,iterations=5)#进行5次迭代闭运算
cv2.imshow('oringinal',o)
cv2.imshow('iter_1',s1)
cv2.imshow('iter_5',s2)
cv2.waitKey()
cv2.destroyAllWindows()
5.梯度运算:使用原图像-腐蚀后的图像;函数表达式:result=cv2.morphologyEx(src,cv2.MORPH_Gradient,kernel)其中kernel是卷积核
import cv2
import numpy as np
o=cv2.imread('D:/cc1/gradient.bmp',cv2.IMREAD_UNCHANGED)
k1=np.ones((4,4),np.uint8)
s1=cv2.morphologyEx(o,cv2.MORPH_GRADIENT,k1)
s2=cv2.morphologyEx(o,cv2.MORPH_GRADIENT,k1,iterations=5)
cv2.imshow('original',o)
cv2.imshow('iter_1',s1)
cv2.imshow('iter_8',s2)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
6.图像礼帽操作:原始图像-开运运算,得到的就是噪声图像;result=cv2.morphologyEx(src,cv2.MORPH_TOPHAT,kernel)其中kernel是卷积核。
import cv2
import numpy as np
o=cv2.imread('D:/cc1/tophat.bmp',cv2.IMREAD_UNCHANGED)
k1=np.ones((5,5),np.uint8)
s1=cv2.morphologyEx(o,cv2.MORPH_TOPHAT,k1)
s2=cv2.morphologyEx(o,cv2.MORPH_TOPHAT,k1,iterations=8)
cv2.imshow('original',o)
cv2.imshow('iter_1',s1)
cv2.imshow('iter_5',s2)
cv2.waitKey()
cv2.destroyAllWindows()
- 黑帽操作:闭运算-原始图像:即得到内部的噪声;result=cv2.morphologyEx(src,cv2.MORPH_BLACKHAT,kernel)其中kernel是卷积核。
import cv2
import numpy as np
o=cv2.imread('D:/cc1/blackhat.bmp',cv2.IMREAD_UNCHANGED)
k1=np.ones((4,4),np.uint8)
s1=cv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k1)
s2=cv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k1,iterations=5)
cv2.imshow('original',o)
cv2.imshow('iter_1',s1)
cv2.imshow('iter_5',s2)
cv2.waitKey()
cv2.destroyAllWindows()
结果为
Sober算子:
1.Soberx,y轴计算规则:
2.Sober在二维图像上的应用:
import cv2
import numpy as np
o=cv2.imread('D:/cc1/sobel.bmp',cv2.IMREAD_UNCHANGED)
s2_x=cv2.Sobel(o,cv2.CV_64F,dx=1,dy=0)#sober中x计算,如计算赋值则不显示
s2_y=cv2.Sobel(o,cv2.CV_64F,dx=0,dy=1)#sobery计算
s2_xycon=cv2.Sobel(o,cv2.CV_64F,dx=1,dy=1)#soberx,y计算
s2_x=cv2.convertScaleAbs(s2_x)#把sober计算的赋值转换成正值,-1不会转换,cv2.CV_64F会转换
s2_y=cv2.convertScaleAbs(s2_y)
s2_xy=cv2.addWeighted(s2_x,0.5,s2_y,0.5,0)#
cv2.imshow('original',o)
cv2.imshow('s2_x',s2_x)
cv2.imshow('s2_y',s2_y)
cv2.imshow('s2_xy',s2_xy)
cv2.imshow('s2_xycon',s2_xycon)
cv2.waitKey()
cv2.destroyAllWindows()
3.Sober在彩色图像的应用:
import cv2
import numpy as np
o=cv2.imread('D:/cc1/lenacolor.png',cv2.IMREAD_UNCHANGED)
s2_x=cv2.Sobel(o,cv2.CV_64F,dx=1,dy=0)
s2_y=cv2.Sobel(o,cv2.CV_64F,dx=0,dy=1)
s2_xycon=cv2.Sobel(o,cv2.CV_64F,dx=1,dy=1)
s2_x=cv2.convertScaleAbs(s2_x)
s2_y=cv2.convertScaleAbs(s2_y)
s2_xy=cv2.addWeighted(s2_x,0.5,s2_y,0.5,0)
cv2.imshow('original',o)
cv2.imshow('s2_x',s2_x)
cv2.imshow('s2_y',s2_y)
cv2.imshow('s2_xy',s2_xy)
cv2.imshow('s2_xycon',s2_xycon)
cv2.waitKey()
cv2.destroyAllWindows()
所有程序连接:
链接:https://pan.baidu.com/s/1vnluuTe83RpNLmf7X8fsfg
提取码:aspw
复制这段内容后打开百度网盘手机App,操作更方便哦
注:本文根据李大洋老师所讲内容自己进行整理。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158954.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...