前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv滤波、图像形运算、Sober算子

opencv滤波、图像形运算、Sober算子

作者头像
全栈程序员站长
发布2022-09-14 10:48:40
3010
发布2022-09-14 10:48:40
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1.opencv中滤波操作:ksize必须是奇数

代码语言:javascript
复制
1.均值操作:选定图像上的行数和列数,求出总和,除以总个数,然后将这个数放到这个选定区的中间区域中。数学表达式:4上的值=(5+6+6+7+4+.....+55)/25;
函数:result=cv2.blur(src,ksize)
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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()

结果为

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
2方框滤波:
函数:result=cv2.boxFliter(src,ddepth,ksize,normalize),在这个用法中ddpeth一般设置为-1,
计算方法:
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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()

结果为

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
 3.高斯滤波:让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。
 函数:result=cv2.Gaussian(src,ksize,sigmaX)
 其中sigmaX:X 方向方差,控制权重
 	sigmaX=0时,sigma=0.3*(ksize-1)*0.5-1)+0.8
代码语言:javascript
复制
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()

结果为

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
4.中值滤波:让ksize中的数据按照像素大小进行排列,取排序像素中间的值作为中值滤波的像素值:
函数:cv2.mediablur(src,ksize)
代码语言:javascript
复制
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)

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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)

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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是卷积核。主要使用于图像外面有噪声

代码语言:javascript
复制
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是卷积核

代码语言:javascript
复制
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是卷积核

代码语言:javascript
复制
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是卷积核。

代码语言:javascript
复制
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()
在这里插入图片描述
在这里插入图片描述
  1. 黑帽操作:闭运算-原始图像:即得到内部的噪声;result=cv2.morphologyEx(src,cv2.MORPH_BLACKHAT,kernel)其中kernel是卷积核。
代码语言:javascript
复制
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算子:

代码语言:javascript
复制
1.Soberx,y轴计算规则:
在这里插入图片描述
在这里插入图片描述

2.Sober在二维图像上的应用:

代码语言:javascript
复制
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在彩色图像的应用:

代码语言:javascript
复制
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,操作更方便哦 注:本文根据李大洋老师所讲内容自己进行整理。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158954.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.opencv中滤波操作:ksize必须是奇数
  • Sober算子:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档