簡體   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