首页 > 解决方案 > 如何使用python将图像中方形标题的背景从黑色反转为白色?

问题描述

我正在尝试将方形标题(包含 TERMS PONUMBER PROJECT 的黑条)的背景设​​置为白色,将文本设置为黑色。

sample_image 发票

我尝试使用 findContours 方法来查找轮廓,然后裁剪并反转它们,以便我以黑色文本和白色背景形式获得它们。但问题是我不知道如何继续进行,或者有没有更好的方法来解决这个问题

image =cv2.imread("default.jpg")
gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

th, thresh = cv2.threshold(gray,1, 255, cv2.THRESH_BINARY_INV)

kernel = cv2.getStructuringElemnt(cv2.MORPH_ELLIPSE,(7,7))
morp_image = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

contours = cv2.findContours(morp_image, 
cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]
cnts = sorted(contours,key=cv2.contourArea)[-1]

上面的代码确实找到了每个这样的轮廓,例如如果我将代码最后一行中的 [-1] 更改为 [-2],它将找到下一个轮廓,但我想在一次完成图像并将这些区域的背景设置为白色,同时将文本更改为黑色。

谢谢

标签: pythonimageopencvimage-processingcomputer-vision

解决方案


这是一个简单的方法

  • 将图像转换为灰度和高斯模糊
  • 大津阈值获取二值图像
  • 寻找轮廓
  • 使用角点数和轮廓区域进行过滤
  • 提取ROI,反转ROI,替换成原始图像

这个想法是,如果轮廓有 4 个角,它必须是正方形/矩形。此外,我们使用最小轮廓区域进行过滤以忽略噪声。如果轮廓通过了我们的过滤器,那么我们就有了想要反转的 ROI。检测到的 ROI

在此处输入图像描述

现在我们使用 Numpy 切片提取每个 ROI。这是反转前后的每个 ROI

在此处输入图像描述 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

现在我们只需将每个反转的 ROI 替换回原始图像即可得到我们的结果

在此处输入图像描述

import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.015 * peri, True)
    area = cv2.contourArea(c)
    if len(approx) == 4 and area > 1000:
        x,y,w,h = cv2.boundingRect(c)
        ROI = 255 - image[y:y+h,x:x+w]
        image[y:y+h, x:x+w] = ROI

cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()

推荐阅读