我试图将方形标题的背景(包含 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],它将找到下一个轮廓,但我想找到所有这样的轮廓一次性将图像中的区域设置为白色,同时将文本更改为黑色。
谢谢
最佳答案
这是一个简单的方法
- 将图像转换为灰度和高斯模糊
- Otsu获取二值图像的阈值
- 查找轮廓
- 使用角点数量和轮廓面积进行过滤
- 提取 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 - 如何使用python将图像中方形标题的背景从黑色反转为白色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57903809/