图像处理

图片处理-opencv-2.图像平滑

2020-10-13  本文已影响0人  lk311

图像平滑

 

1.图像增强

图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:


image.png

2.图像平滑

图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中值滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。常用的算法均值滤波、方框滤波、高斯滤波和中值滤波

#为图像增加噪声
import cv2
import numpy as np

#读取图片
img = cv2.imread("data/test3.jpg", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape

#加噪声
for i in range(3000):    
    x = np.random.randint(0, rows) 
    y = np.random.randint(0, cols)    
    img[x,y,:] = 255

cv2.imshow("test3_noise", img)
           
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("data/test3_noise.jpg", img)

1.均值滤波(简单局部平均)

均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值

result = cv2.blur(原始图像,核大小)

缺点:图像模糊

import cv2  
import numpy as np  
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5)) 

#读取图片
img = cv2.imread('data/test3_noise.jpg')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
 
#均值滤波
result = cv2.blur(source, (5,5))
 
#显示图形
titles = ['Source Image', 'Blur Image']  
images = [source, result]  
for i in range(2):  
    plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
    plt.title(titles[i])  
    plt.xticks([]),plt.yticks([])  
plt.show()
image.png

2.方框滤波(简单局部平均)

方框滤波和均值滤波核基本一致,区别是需不需要均一化处理

result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)

缺点:图像模糊

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 5)) 

#读取图片
img = cv2.imread('data/test3_noise.jpg')
source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#方框滤波
result_1 = cv2.boxFilter(source, -1, (5, 5), normalize=1)
result_0 = cv2.boxFilter(source, -1, (5, 5), normalize=0)
#显示图形
titles = ['Source Image', 'BoxFilter Image normalize=1', 'BoxFilter Image normalize=0']
images = [source, result_1, result_0]
for i in range(3):
    plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

3.高斯滤波(邻域平均)

高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值。高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。

dst = cv2.GaussianBlur(src, ksize, sigmaX)

缺点:边界模糊

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5)) 

#读取图片
img = cv2.imread('data/test3_noise.jpg')
source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#高斯滤波
result = cv2.GaussianBlur(source, (3,3), 0)

#显示图形
titles = ['Source Image', 'GaussianBlur Image']
images = [source, result]
for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

4.中值滤波(非线性)

中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。

dst = cv2.medianBlur(src, ksize)

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5)) 

#读取图片
img = cv2.imread('data/test3_noise.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#中值滤波
result = cv2.medianBlur(img, 3)

#显示图形
titles = ['Source Image', 'medianBlur Image']
images = [img, result]
for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png
上一篇下一篇

猜你喜欢

热点阅读