繁体   English   中英

如何减少 python 上图像的噪声?

[英]how to reduce the noise of an image on python?

到目前为止,这是我的代码。 我完全迷失了,不知道该怎么办。 其 python 语言。 我不能使用 cv2 或 matpolibic。 我只被允许使用 cimpl 和 numpy

from Cimpl import*
import numpy as np 
def reduce_noise (image: Image) -> Image:
    new_image = copy(image)
    for pixel in image:
        X, Y, (r, g, b) = pixel

        r_list = [r, r1, r2, r3, r4]
        r_list.sort()
        new_r = r_list[2]
        
        g_list = [g, g1, g2, g3, g4]
        g_list.sort()
        new_g = g_list[2]
        
        b_list = [b, b1, b2, b3, b4]
        b_list.sort()
        new_b = b_list[2]
        reduce_noise = create_color(new_r, new_g, new_b)
        set_color(new_image, X, Y, reduce_noise)
        
    return new_image

image = load_image (choose_file())
show (image) 
new_image = reduce_noise(image)
show (new_image)

第 1 部分(另见下文第 2 部分)

我决定改进你对去噪算法的尝试。 正如我从您的代码中看到的那样,您尝试(有编码错误)实现中值滤波器,在每个像素周围取几个像素的中值。

我在纯 Numpy 中实现了下一个算法。 但是要从/向文件读取和写入图像,我使用了 PIL 库,只需将此 PIL 用法替换为您喜欢的任何读取和写入文件的 numpy 数组。 我只在第一行和最后一行代码上使用了 PIL。 仅用于测试的 PIL 库可以通过pip install pillow ,它是 python 中最受欢迎的映像库之一。

在下一个算法中,中值滤波器的强度由n参数控制,在我的情况下等于 7。 n意味着我们在大小为n的正方形像素中取中位数n

我的代码适用于灰色和彩色图像,请参阅代码后的灰色示例和灰色示例后的彩色示例。

在线尝试!

def reduce_noise(a, n = 7):
    import numpy as np
    am = np.zeros(
        (n, n) + (a.shape[0] - n + 1, a.shape[1] - n + 1) + a.shape[2:],
        dtype = a.dtype
    )
    for i in range(n):
        for j in range(n):
            am[i, j] = a[i:i + am.shape[2], j:j + am.shape[3]]
    am = np.moveaxis(am, (0, 1), (-2, -1)).reshape(*am.shape[2:], -1)
    am = np.median(am, axis = -1)
    if am.dtype != a.dtype:
        am = (am.astype(np.float64) + 10 ** -7).astype(a.dtype)
    return am
    
import PIL.Image, numpy as np
a = np.array(PIL.Image.open('noised.jpg'))
a = reduce_noise(a)
PIL.Image.fromarray(a).save('noised_out.png')

灰色示例(之后的彩色示例):

输入:

在此处输入图像描述

Output:

在此处输入图像描述

彩色示例:

输入:

在此处输入图像描述

Output:

在此处输入图像描述


第2部分

我的道歉,我误读了你的问题,而不是“我不能使用 cv2”,我读的是“我可以使用 cv2”,因此实施了下一个 OpenCV 算法作为我第一次尝试解决你的任务(第 1 部分算法稍后实施) .

根据OpenCV 降噪教程,您可以像下面的代码一样对图像进行降噪。 它使用cv2.fastNlMeansDenoisingColored() function,如果你有灰度图像,还有这个 function 的灰度变体。

去噪度在我的代码中由 20,20,14,42 参数控制20, 20, 14, 42去噪非常强,可以使用默认值(不提供这些数字),它会给出更小的去噪度。 对于您的图像,从默认值 3、3、7、21 开始3, 3, 7, 21也许它们就足够了,不需要非常强的去噪,并尝试使用这些值。

在线尝试!

import numpy as np, cv2
from matplotlib import pyplot as plt
img = cv2.imread('birds.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.fastNlMeansDenoisingColored(img, None, 20, 20, 14, 42)
cv2.imwrite('birds_out.png', cv2.cvtColor(dst, cv2.COLOR_RGB2BGR))
plt.subplot(121); plt.imshow(img)
plt.subplot(122); plt.imshow(dst)
plt.show()

输入:

在此处输入图像描述

Output:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM