网站使用授权书,风云榜小说排行榜,一家专门做特卖的网站手机版,网站建设目的确定对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置#xff0c;这个操作就叫卷积。
卷积需要4个嵌套循环#xff0c;所以它并不快#xff0c;除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波
图像滤波是尽…对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置这个操作就叫卷积。
卷积需要4个嵌套循环所以它并不快除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波
图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制是图像预处理中不可缺少的操作其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
线性滤波是图像处理最基本的方法它允许我们对图像进行处理产生很多不同的效果。首先我们需要一个二维的滤波器矩阵(卷积核)和一个要处理的二维图像。然后对于图像的每一个像素点计算它的邻域像素和滤波器矩阵的对应元素的乘积然后加起来作为该像素位置的值。这样就完成了滤波过程。
对于滤波器/卷积核也有一定的规则要求
滤波器的大小应该是奇数这样它才有一个中心例如3x35x5或者7x7。有中心了也有了半径的称呼例如5x5大小的核的半径就是2滤波器矩阵所有的元素之和应该要等于1这是为了保证滤波前后图像的亮度保持不变。当然了这不是硬性要求了。如果滤波器矩阵所有元素之和大于1那么滤波后的图像就会比原图像更亮反之如果小于1那么得到的图像就会变暗。如果和为0图像不会变黑但也会非常暗。对于滤波后的结构可能会出现负数或者大于255的数值。对这种情况我们将他们直接截断到0和255之间即可。对于负数也可以取绝对值。
均值滤波
将卷积核内的所有灰度值加起来,然后计算出平均值,用这个平均值填充卷积核正中间的值,这样做可以降低图像的噪声,同时也会导致图像变得模糊。 代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 写代码时用的jupyter,cv2.imshow总是卡死所以用的plt方便显示图像
def imgshow(img):img cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()dog_img cv2.imread(/Users/guojun/Desktop/444.png,cv2.IMREAD_COLOR)
# 均值滤波: cv2.blur(img,knelsize) img-图片卷积核大小
dst cv2.blur(dog_img,(10,10))
imgshow(dst)
高斯模糊
采用均值滤波降噪会导致图像模糊的非常厉害,有没有一种方式既能保留像素点真实值又能降低图片噪声呢?那就是加权平均的方式. 离中心点越近权值越高,越远权值越低.
但是权重的大小设置非常麻烦,那么有没有一种方式能够自动生成呢? 这个就是需要用到高斯函数
高斯函数呈现出的特征就是中间高两边低的钟形
高斯模糊通常被用来减少图像噪声以及降低细节层次。 代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 写代码时用的jupyter,cv2.imshow总是卡死所以用的plt方便显示图像
def imgshow(img):img cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()dog_img cv2.imread(/Users/guojun/Desktop/444.png,cv2.IMREAD_COLOR)
# 高斯模糊 参数1:图像 参数2:卷积核大小, 参数3:标准差越大去除高斯噪声能力越强图像越模糊
dog_gaussianblur cv2.GaussianBlur(dog_img,(15,15),50)
imgshow(dog_gaussianblur)
中值滤波
对邻近的像素点进行灰度排序,然后取中间值,它能有效去除图像中的椒盐噪声
操作原理:
卷积域内的像素值从小到大排序取中间值作为卷积输出
代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 写代码时用的jupyter,cv2.imshow总是卡死所以用的plt方便显示图像
def imgshow(img):img cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()img cv2.imread(/Users/guojun/Desktop/444.png,cv2.IMREAD_COLOR)
# 中值滤波 参数1:图像 参数2:卷积核大小卷积核必须为单数
dst cv2.medianBlur(img,11)
imgshow(dst)
Sobel算子
Sobel算子是像素图像边缘检测中最重要的算子之一在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上它是一个离散的一阶差分算子用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子将会产生该点对应的梯度矢量。
使用方式
原图--- x 方向sobel原图---- y 方向sobelxy合在一起
水平梯度 垂直梯度 合成 备注为了提高计算机效率我们通常会使用: G |Gx||Gy| 代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 写代码时用的jupyter,cv2.imshow总是卡死所以用的plt方便显示图像
def imgshow(img):img cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()# Sobel算子
img cv2.imread(/Users/guojun/Desktop/mri.jpg,cv2.IMREAD_GRAYSCALE)# Sobel算子x方向求导
# 参数1:图像参数2:图像的深度-1表示和原图相同参数3:x方向求导的阶数 参数4:y方向求导的阶数
x_sobel cv2.Sobel(img,cv2.cv2.CV_32F,1,0)
# 将图像转为8位int
x_sobel cv2.convertScaleAbs(x_sobel)
# imgshow(x_sobel)# Sobel算子:y方向求导
y_sobel cv2.Sobel(img,cv2.cv2.CV_32F,0,1)
# 将图像转为8位int
y_sobel cv2.convertScaleAbs(y_sobel)
# imgshow(y_sobel)# 将x,y方向的内容叠加起来
dst x_sobel y_sobel
imgshow(dst)
Scharr算子
由于使用Sobel算子计算的时候有一些偏差, 所以opencv提供了sobel的升级版Scharr函数,计算比sobel更加精细. 代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 写代码时用的jupyter,cv2.imshow总是卡死所以用的plt方便显示图像
def imgshow(img):img cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()# Scharr算子
img cv2.imread(/Users/guojun/Desktop/mri.jpg,cv2.IMREAD_GRAYSCALE)# Scharr算子x方向求导
# 参数1:图像参数2:图像的深度-1表示和原图相同参数3:x方向求导的阶数 参数4:y方向求导的阶数
x_Scharr cv2.Scharr(img,cv2.cv2.CV_32F,1,0)
# 将图像转为8位int
x_Scharr cv2.convertScaleAbs(x_sobel)
# imgshow(x_sobel)# Scharr算子:y方向求导
y_Scharr cv2.Sobel(img,cv2.cv2.CV_16S,0,1)
# 将图像转为8位int
y_Scharr cv2.convertScaleAbs(y_sobel)
# imgshow(y_sobel)# 将x,y方向的内容叠加起来
dst x_Scharr y_Scharr
imgshow(dst)
拉普拉斯算子
通过拉普拉斯变换后增强了图像中灰度突变处的对比度使图像中小的细节部分得到增强,使图像的细节比原始图像更加清晰。