Python:如何删除像素注释?

3

我有一个像下面这样的图片文件...

输入图像描述

我想要删除该图片中所有的注释。不清楚如何在Python中完成此操作。这是我所做的:

import cv2 as cv
import numpy as np

img = cv.imread("/path/to/image/1.png")
image_contours = np.zeros((img.shape[1], img.shape[0], 1), np.uint8)

image_binary = np.zeros((img.shape[1], img.shape[0], 1), np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel], 127, 255, cv.THRESH_BINARY)    
    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours, contours, -1, (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite("/path/to/save/save.png", image_binary)

我没有把原始图片从注释中删除,但我得到了下面这个......我错过了什么吗?

在此输入图片描述

1个回答

3
以下是使用Python/OpenCV进行掩码中值滤波的一种方法。
  • 读取输入图像
  • 转换为灰度图像
  • 阈值化作为掩码
  • 对掩码应用形态学运算以扩张白色字母
  • 反转掩码
  • 将掩码和反转掩码制作成3通道图像
  • 对图像进行中值滤波处理
  • 将掩码应用于中值滤波后的图像
  • 将反转掩码应用于输入图像
  • 将两个图像相加
  • 保存结果

输入图像:

enter image description here

import cv2
import numpy as np
import math

# read image
img = cv2.imread('xray.png')

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold 
mask = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)[1]

# open and then dilate mask to make white regions slightly larger
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25,25))
mask = cv2.morphologyEx(mask, cv2.MORPH_DILATE, kernel)

# invert mask
mask_inv = 255 - mask

# make mask and inverted mask 3 channel
mask = cv2.merge([mask,mask,mask])
mask_inv = cv2.merge([mask_inv,mask_inv,mask_inv])

# median filter input image
median = cv2.medianBlur(img, 55)

# apply inverted mask to image
img_masked = cv2.bitwise_and(img, mask_inv)

# apply mask to median
median_masked = cv2.bitwise_and(median, mask)

# add together
result = cv2.add(img_masked,median_masked)

# save results
cv2.imwrite('xray_mask.png', mask)
cv2.imwrite('xray_mask_inv.png', mask_inv)
cv2.imwrite('xray_median.png', median)
cv2.imwrite('xray_masked.png', img_masked)
cv2.imwrite('xray_median_masked.png', median_masked)
cv2.imwrite('xray_removed.png', result)

cv2.imshow('gray', gray)
cv2.imshow('mask', mask)
cv2.imshow('mask_inv', mask_inv )
cv2.imshow('median', median)
cv2.imshow('img_masked', img_masked)
cv2.imshow('median_masked', median_masked)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()


掩膜:

enter image description here

反向掩膜:

enter image description here

中值滤波图像:

enter image description here

掩膜中值:

enter image description here

反向掩膜输入:

enter image description here

结果:

enter image description here


非常感谢您提供的逐步解释。 - Mass17
我完全复制并粘贴了你的代码... 但是,我仍然可以看到注释... result = cv2.add(img_masked,median_masked) cv.imwrite("/pathtowrite/test.png", result).. - Mass17
你是在说你得到了不同的结果还是我的结果不够好? - fmw42
是的,大小很重要。您需要根据要删除的文本大小调整medianBlur和形态学。另一种选择是使用掩码进行修复。但是OpenCV和Skimage修复方法在大面积上效果不佳。它们适用于细线或划痕。但您可以尝试使用它们。 - fmw42
您可以将原始图像进行降采样(缩小),计算掩膜中值,将其上采样到原始大小并与原始图像相加。这样的处理可能会更快。 - Alex Alex
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接