欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-30 08:17:50
...

平滑滤波器

平滑滤波器的用途:
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()

数字图像处理——空域滤波
可以看到椒盐噪声也就是将图像上的某些像素点变成黑白像素,从而达到添加噪声的目的。



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

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

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

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()

数字图像处理——空域滤波
可以看到,对于这张图像,5x5的均值滤波效果会更好。



中值滤波
中值滤波算法的实现:
将模板区域内的像素排序,求出中值,例如3x3的模板,第5大是中值;5x5的模板,第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()

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