python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分

I need to remove the blackened section in multiple parts of image using Python CV.

I tried with denoising which doesn't give satisfactory results.

Eg. I need to remove the blackened part in Table Header (below image) and convert the header background to white with contents as black.

python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分_第1张图片

Can anyone help me with choosing the correct library or solution to overcome this?

解决方案

Here's a modified version of @eldesgraciado's approach to filter the dotted pattern using a morphological hit or miss operation on the target pixels in Python. The difference is that instead of subtracting the mask with the binary image which decreases text quality, we dilate the binary image then bitwise-and to retain the text quality.

Obtain binary image. Load image, grayscale, Otsu's threshold

Perform morphological hit or miss operation. We create a dot pattern kernel with cv2.getStructuringElement then use cv2.filter2D to convolve the image

Remove dots. We cv2.bitwise-xor the mask with the binary image

Fix damaged text pixels. We cv2.dilate then cv2.bitwise_and the finalized mask with the input image and color background pixels white

Binary image

python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分_第2张图片

Dot mask

python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分_第3张图片

Remove dots

python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分_第4张图片

Dilate to fix damaged text pixels from the thresholding process

python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分_第5张图片

Result

python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分_第6张图片

Code

import cv2

import numpy as np

# Load image, grayscale, Otsu's threshold

image = cv2.imread('1.jpg')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Perform morphological hit or miss operation

kernel = np.array([[-1,-1,-1], [-1,1,-1], [-1,-1,-1]])

dot_mask = cv2.filter2D(thresh, -1, kernel)

# Bitwise-xor mask with binary image to remove dots

result = cv2.bitwise_xor(thresh, dot_mask)

# Dilate to fix damaged text pixels

# since the text quality has decreased from thresholding

# then bitwise-and with input image

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))

dilate = cv2.dilate(result, kernel, iterations=1)

result = cv2.bitwise_and(image, image, mask=dilate)

result[dilate==0] = [255,255,255]

cv2.imshow('dot_mask', dot_mask)

cv2.imshow('thresh', thresh)

cv2.imshow('result', result)

cv2.imshow('dilate', dilate)

cv2.waitKey()

你可能感兴趣的:(python利用opencv去除图片logo,使用Python OpenCV删除图像的黑色标题部分)