Tengo la siguiente imagen que es una copia escaneada de un libro antiguo. Quiero eliminar el ruido de fondo (que es un poco rojizo) que viene debido al escaneo de la foto antigua.

enter image description here

Actualización:

Después de aplicar opencv, siga la configuración del parámetro en opencv doc , Obtengo el siguiente resultado. ingrese la descripción de la imagen aquí

Por favor, ayude a solucionar este problema.

El código que estoy usando:

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)
0
Doi 27 feb. 2021 a las 00:22

2 respuestas

La mejor respuesta

El color de algunos píxeles que tienen valores de píxeles cercanos al umbral se verá afectado, pero eso depende de la tarea, aquí hay una solución en la que puede ajustar el umbral a un valor que se adapte a su tarea, también puede eliminar el filtro de mediana o reducir el valor sigma (5) si afecta mal al texto, es posible que tenga algún ruido no deseado, pero el texto será legible.

result

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()
1
Bilal 27 feb. 2021 a las 09:03

La biblioteca opencv tiene un par de funciones de denoisong.

Puede encontrar lecturas con ejemplos aquí

0
Lior Cohen 26 feb. 2021 a las 21:32