数字图像处理——空域滤波

数字图像处理——空域滤波平滑滤波器平滑滤波器的用途:1.对大图像处理前,删去无用的细小细节2.连接中断的线段和曲线3.降低噪音4.平滑处理,恢复过分锐化的图像5.图像创艺(阴影、软边、朦胧效果)平滑滤波器的设计可以自行

平滑滤波器

平滑滤波器的用途:
1.对大图像处理前,删去无用的细小细节
2.连接中断的线段和曲线
3.降低噪音
4.平滑处理,恢复过分锐化的图像
5.图像创艺(阴影、软边、朦胧效果)

平滑滤波器的设计可以自行调整,主要就是关注滤波器的大小和滤波器的系数。
在这里插入图片描述
这里我使用椒盐噪声,先生成含有含有椒盐噪声的图像。

import cv2 as cv 
import numpy as np 
import matplotlib.pyplot as plt 
import random

def sp_noise(image,prob):
    ''' 添加椒盐噪声 prob:噪声比例 '''
    output = np.zeros(image.shape,np.uint8)
    thres = 1 - prob 
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = 0
            elif rdn > thres:
                output[i][j] = 255
            else:
                output[i][j] = image[i][j]
    return output

img = cv.imread("pictures/cat.jpg", 0)
img_noise = sp_noise(img, 0.005)
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
    []), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(img_noise, 'gray'), plt.title("img_noise"), plt.xticks(
    []), plt.yticks([])
plt.show()

在这里插入图片描述
可以看到椒盐噪声也就是将图像上的某些像素点变成黑白像素,从而达到添加噪声的目的。

平均滤波
将滤波器滑动到的范围中的所有像素值加起来求出平均值替代中心像素值。
例如一个3×3的均值滤波器是这样:

在这里插入图片描述

这里采用3×3和5×5的均值滤波器分别处理刚刚生成的椒盐噪声图像,对比看看结果:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random


def sp_noise(image, prob):
    ''' 添加椒盐噪声 prob:噪声比例 '''
    output = np.zeros(image.shape, np.uint8)
    thres = 1 - prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = 0
            elif rdn > thres:
                output[i][j] = 255
            else:
                output[i][j] = image[i][j]
    return output


img = cv.imread("pictures/cat.jpg", 0)
img_noise = sp_noise(img, 0.005)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
    []), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(
    img_noise, 'gray'), plt.title("img_noise"), plt.xticks([]), plt.yticks([])
img_aver_3x3 = cv.blur(img_noise, (3, 3))
plt.subplot(2, 2, 3), plt.imshow(
    img_aver_3x3,
    'gray'), plt.title("img_aver_3x3"), plt.xticks([]), plt.yticks([])
img_aver_5x5 = cv.blur(img_noise, (5, 5))
plt.subplot(2, 2, 4), plt.imshow(
    img_aver_5x5,
    'gray'), plt.title("img_aver_5x5"), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
可以看到,对于这张图像,5×5的均值滤波效果会更好。

中值滤波
中值滤波算法的实现:
将模板区域内的像素排序,求出中值,例如3×3的模板,第5大是中值;5×5的模板,第13大是中值,以此类推。
通过滤波器的滑动,每到一个区域,取中值替代原来的像素。

在这里插入图片描述

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random


def sp_noise(image, prob):
    ''' 添加椒盐噪声 prob:噪声比例 '''
    output = np.zeros(image.shape, np.uint8)
    thres = 1 - prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = 0
            elif rdn > thres:
                output[i][j] = 255
            else:
                output[i][j] = image[i][j]
    return output

img = cv.imread("pictures/cat.jpg", 0)
img_noise = sp_noise(img, 0.005)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
    []), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(
    img_noise, 'gray'), plt.title("img_noise"), plt.xticks([]), plt.yticks([])
img_med_3x3 = cv.medianBlur(img_noise, 3)
plt.subplot(2, 2, 3), plt.imshow(
    img_med_3x3,
    'gray'), plt.title("img_med_3x3"), plt.xticks([]), plt.yticks([])
img_med_5x5 = cv.medianBlur(img_noise, 5)
plt.subplot(2, 2, 4), plt.imshow(
    img_med_5x5,
    'gray'), plt.title("img_med_5x5"), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
对比发现,中值滤波在处理这张图像上的效果出奇的好。

锐化滤波器

锐化滤波器的作用:
1.加强图像中景物的边缘和轮廓
2.印刷中的细微层次强调,弥补扫描,挂网对图像的平滑
3.超声探测成像,分辨率低,边缘模糊,通过锐化来改善
4.图像识别中分割前的边缘提取
5.锐化处理恢复过度平滑、曝光不足的图像
6.图像创艺(只剩下边界的特殊图像)
7.尖端武器的目标识别、定位

锐化滤波器是设计:
1.中心系数为正值,外围为负值
2.系数之和为0

在这里插入图片描述

一阶微分算子:Sobel算子

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random

img = cv.imread("pictures/lena.jpg", 0)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
    []), plt.yticks([])
# X方向用sobel算子进行锐化
img_sobel_x = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3)
# Y方向用sobel算子进行锐化
img_sobel_y = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3)
# 格式转换
img_sobel_x = cv.convertScaleAbs(img_sobel_x)
img_sobel_y = cv.convertScaleAbs(img_sobel_y)
# 最后一个参数是偏置 这里我取0
img_sobel = cv.addWeighted(img_sobel_x, 0.5, img_sobel_y, 0.5, 0)
plt.subplot(2, 2, 2), plt.imshow(
    img_sobel, 'gray'), plt.title("img_sobel"), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(img_sobel_x,
                                 'gray'), plt.title("img_sobel_x"), plt.xticks(
                                     []), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(img_sobel_y,
                                 'gray'), plt.title("img_sobel_y"), plt.xticks(
                                     []), plt.yticks([])
plt.show()

在这里插入图片描述
先分别计算x和y方向经过Sobel算子处理过的图像,然后以相同的权重加在一起。

二阶微分算子:拉普拉斯算子
拉普拉斯算子模板以及扩展模板:
在这里插入图片描述
锐化模板特点:模板内系数有正有负,表示差分运算。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random

img = cv.imread("pictures/lena.jpg", 0)
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
    []), plt.yticks([])
img_laplacian = cv.Laplacian(img, cv.CV_64F)
img_laplacian = cv.convertScaleAbs(img_laplacian)
plt.subplot(1, 2, 2), plt.imshow(
    img_laplacian,
    'gray'), plt.title("img_laplacian"), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

今天的文章数字图像处理——空域滤波分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60505.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注