Airspace smoothing

本文详细介绍并演示了多种图像处理技术,包括卷积、均值滤波、高斯滤波、中值滤波和双边滤波等图像平滑方法,以及如何利用这些方法去除加性、乘性和泊松噪声,提供了丰富的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 戳这里观看视频

空域平滑

 

加性噪声:可加性噪声,一般易于消除

乘性噪声:非线性引入的噪声,往往与信号密切相关

量化噪声:模拟信号转化到数字信号时取整变化产生的误差

注意template左上角的1后面有个黑点,代表运算的结果后赋给这个对应点。

一般噪声的像素与周围的像素都明显不同。


instance:

(1)cv.filter2D函数说明

使用自定义内核对图像进行卷积。该功能将任意线性滤波器应用于图像。支持就地操作。当光圈部分位于图像外部时,该功能会根据指定的边框模式插入异常像素值。

dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
参数描述
src原图像
dst目标图像,与原图像尺寸和通道数相同
ddepth目标图像的所需深度
kernel卷积核(或相当于相关核),单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用拆分将图像拆分为单独的颜色平面,然后单独处理它们。
anchor内核的锚点,指示内核中过滤点的相对位置;锚应位于内核中;默认值(-1,-1)表示锚位于内核中心。
detal在将它们存储在dst中之前,将可选值添加到已过滤的像素中。类似于偏置。
borderType像素外推法,参见BorderTypes

Note:当ddepth=-1时,表示输出图像与原图像有相同的深度。

(2)cv.blur()函数说明

blur()函数可以用标准化的盒式过滤器来平滑图像。

blur的作用是对输入的图像src进行均值滤波后用dst输出。

(3)cv.GaussianBlur函数说明

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

参数:dst=GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])
src:输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
dst:输出图像的大小和类型与src相同。
ksize:高斯内核大小。 ksize.width和ksize.height可以不同,但​​它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。
sigmaX :X方向上的高斯核标准偏差。
sigmaY: Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

(4)cv.medianBlur函数说明

 medianBlur() 执行中值滤波操作,中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替 。

dst=cv.medianBlur(src,ksize,dst=None)

ksize滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……

该函数使用具有ksize*ksize孔径大小的中值滤波器来平滑图像。

(5)cv.bilateralFilter函数说明

参数:

d:像素的邻域直径。

sigmaColor:颜色空间的标准方差.

sigmaSpace:坐标空间的标准方差(像素单位)

program

# -*- coding:utf-8
# opencv read image is BGR channel,and matplot read is RGB

import cv2 as cv
import numpy as np
img = cv.imread("/home/image/Pictures/lena_salt.jpg",0)
(H,W) =img.shape

def display(title,imagenum,files):
    cv.namedWindow(title, 0)
    cv.resizeWindow(title,imagenum*W,H)
    cv.imshow(title, np.hstack(files))


def filtter2d(img):#类似卷积
    fil1 = np.array([[ -1,-1, 0],
                     [ -1, 0, 1],
                     [ 0, 1, 1]])
    res = cv.filter2D(img,-1,fil1)#CV自带的图像平滑方法
    files =[img,res]
    display('3X3 filter2d',files.__len__(),files)
    cv.waitKey(0)
    fil2 = np.ones((5,5),np.float32)/25
    dst = cv.filter2D(img,-1,fil2)
    files =[img,dst]
    display('5X5 filter2d',files.__len__(),files)
    cv.waitKey(0)

def  blur(img):#均值滤波
    template1 =(3,5)
    blurs = cv.blur(img,template1)
    files = [img, blurs]
    display('3X5 blur',files.__len__(),files)
    cv.waitKey(0)

def gaussiuan(img):#高斯滤波
    imgg = np.zeros(img.shape,np.uint8)
    imgg[:] = img[:]
    for i in range(1000):
        temp_x = np.random.randint(0, img.shape[0])
        temp_y = np.random.randint(0, img.shape[1])
        imgg[temp_x][temp_y] = 255
    blur = cv.GaussianBlur(imgg,ksize=(5,5),sigmaX=0)
    files = [img, imgg,blur ]
    display('Gaussi blur', files.__len__(), files)
    cv.waitKey(0)

def middenblur(img):#中值滤波
    imgg = np.zeros(img.shape,np.uint8)
    imgg[:] = img[:]
    for i in range(3000):
        temp_x = np.random.randint(0, img.shape[0])
        temp_y = np.random.randint(0, img.shape[1])
        imgg[temp_x][temp_y] = 255
    blur = cv.medianBlur(imgg,7)
    files = [img, imgg,blur ]
    display('middian blur', files.__len__(), files)
    cv.waitKey(0)

def bilateralFilter(img):
    imgg = np.zeros(img.shape,np.uint8)
    imgg[:] = img[:]
    for i in range(5000):
        temp_x = np.random.randint(0, img.shape[0])
        temp_y = np.random.randint(0, img.shape[1])
        imgg[temp_x][temp_y] = 255
    blur = cv.bilateralFilter(imgg,9,75,75,)
    files = [img, imgg,blur ]
    display('bilateralFilter blur', files.__len__(), files)
    cv.waitKey(0)


if __name__ == '__main__':
    filtter2d(img)
    blur(img)
    gaussiuan(img)
    middenblur(img)
    bilateralFilter(img)

原图:

自己运行体会。


期中考试部分解析:

如何去除乘性噪声和泊松噪声?

去除泊松分布:

泊松噪声用haar小波效果不错

# 泊松分布
import pywt#小波分析库
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread('03Poisson.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY).astype('float32')
coeffs = pywt.dwt2(gray, 'haar')
CA, (CH, CV, CD) = coeffs
plt.subplot(121)
plt.imshow(CA, 'gray')
plt.title('result')
plt.subplot(122)
plt.imshow(gray, 'gray')
plt.title('original')
plt.show()

图片:

 运行结果(效果感人,很赞):

 去除乘性噪声:

乘性噪声先转化为加性噪声在用中值滤波效果可以。

乘性噪声:t=s*n.s为原始信号,n为噪声。对t取log酒转化为加性噪声:logt = logs + logn

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('04mutil.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray=np.float32(gray)
log = np.log(gray)#乘性噪声变加性噪声
# blur = cv.GaussianBlur(log, (5, 5), 0)
# blur = cv.blur(log, (3, 3))
blur = cv.medianBlur(log,5)
# blur = cv.bilateralFilter(log,9,75,75)
reverse = np.exp(blur)#取了log再变回去
reverse = np.uint8(reverse)
plt.subplot(221)
plt.imshow(log, 'gray')
plt.title('log')
plt.xticks([]),plt.yticks([])
plt.subplot(222)
plt.imshow(blur, 'gray')
plt.title('blur')
plt.xticks([]),plt.yticks([])
plt.subplot(223)
plt.imshow(reverse, 'gray')
plt.title('result')
plt.xticks([]),plt.yticks([])
plt.subplot(224)
plt.imshow(gray, 'gray')
plt.title('original')
plt.xticks([]),plt.yticks([])
plt.show()

图片:

运行结果:

 感叹一句学长tql,我太弱鸡了www

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深海鱼肝油ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值