python - 如何使用python将图像中方形标题的背景从黑色反转为白色?
问题描述
我正在尝试将方形标题(包含 TERMS PONUMBER PROJECT 的黑条)的背景设置为白色,将文本设置为黑色。
我尝试使用 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],它将找到下一个轮廓,但我想在一次完成图像并将这些区域的背景设置为白色,同时将文本更改为黑色。
谢谢
解决方案
这是一个简单的方法
- 将图像转换为灰度和高斯模糊
- 大津阈值获取二值图像
- 寻找轮廓
- 使用角点数和轮廓区域进行过滤
- 提取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()
推荐阅读
- python - 捕获 Argparse 错误并将其传递给 Discord 客户端
- c - 在一个节点中有多个元素的 B 树中递归地找到第 k 个最小的元素
- excel - Excel VBA:无法对重叠选择使用命令
- playframework-2.6 - 在 builds.sbt 和 plugins.sbt 中添加解析器的区别
- java - Spring如何仅通过形式参数名称匹配查询参数?
- php - 从另一个函数调用 PHP 函数
- ios - UIImagePickerController 在 iOS 11 上因“[UIViewController _setCameraOverlayView:]: unrecognized selector”而崩溃
- angular - 无法在角度 6 中编译 @Injectable
- http - 我网站的 http 和 https 版本的工作方式不同
- javascript - 用 mongo shell 执行 JavaScript 函数没有输出