Шумоподавление фотографии с помощью Python

#python #image-processing #noise

#питон #обработка изображений #шум

Вопрос:

У меня есть следующее изображение, которое представляет собой отсканированную копию старой книги. Я хочу удалить шум на заднем плане (который немного красноватый), который возникает из-за сканирования старой фотографии.

введите описание изображения здесь

Обновить:

После применения opencv , следуя настройкам параметров в документе opencv, я получаю следующий результат. введите описание изображения здесь

Пожалуйста, помогите исправить это.

Код, который я использую:

 import numpy as np
import cv2
from matplotlib import pyplot as plt

def display_image_in_actual_size(im_data):

    dpi = 80
    height, width, depth = im_data.shape

    # What size does the figure need to be in inches to fit the image?
    figsize = width / float(dpi), height / float(dpi)

    # Create a figure of the right size with one axes that takes up the full figure
    fig = plt.figure(figsize=figsize)
    ax = fig.add_axes([0, 0, 1, 1])

    # Hide spines, ticks, etc.
    ax.axis('off')

    # Display the image.
    ax.imshow(im_data, cmap='gray')

    plt.show()

img = cv2.imread('scan03.jpg')

dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)

display_image_in_actual_size(img)
display_image_in_actual_size(dst)
 

Комментарии:

1. Хотели бы вы также «отбелить» покраснение? Если это так, возможно, вы захотите изучить коррекцию баланса белого.

Ответ №1:

Это повлияет на цвет некоторых пикселей, которые имеют значения, близкие к пороговым, но это зависит от задачи, вот одно из решений, при котором вы можете настроить пороговое значение на значение, соответствующее вашей задаче, также вы можете удалить медианный фильтр или уменьшить значение сигмы (5) , если это плохо влияет на текст,у вас может возникнуть некоторый нежелательный шум, но текст будет читаемым.

Результат

 import numpy as np
import matplotlib.pyplot as plt
import cv2
# Read Image
img = cv2.imread('input.jpg')
# BGR --> RGB
RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# BGR --> Gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Set thresholds
th_white = 210
th_black = 85
# copy original gray
mask_white = gray.copy()
mask_black = gray.copy()
# Thresholding
mask_white[mask_white<th_white] = 0
mask_black[mask_black<th_black] = 0
mask_white[mask_white>=th_white] = 255
mask_black[mask_black>=th_black] = 255
# Median Filtering (you can remove if the text is not readable)
median_white = cv2.medianBlur(mask_white,5)
median_black = cv2.medianBlur(mask_black,5)
# Mask 3 channels
mask_white_3 = np.stack([median_white, median_white, median_white], axis=2)
mask_black_3 = np.stack([median_black, median_black, median_black], axis=2)
# Masking the image(in RGB)
result1 = np.maximum(mask_white_3, RGB)
result2 = np.minimum(mask_black_3, result1)
# Visualize the results
plt.imshow(result2)
plt.axis('off')
plt.show()
 

Ответ №2:

opencv в библиотеке есть несколько функций шумоподавления.

Вы можете найти чтение с примерами здесь

Комментарии:

1. Привет. Я пытался использовать opencv . Результат, который я получаю, немного голубоватый. Я обновил вывод в вопросе. Возможно, я не уверен в настройке параметров, которые приводят к тому, что результат будет таким. Не могли бы вы помочь?