Python 如何制作遮罩以将除文本外的所有图像背景设置为白色?

Python 如何制作遮罩以将除文本外的所有图像背景设置为白色?,python,opencv,Python,Opencv,我试图提取这个区域的文本以运行OCR,但是杂散的黑色边缘干扰了一些结果。有没有办法隔离这篇文章 找到这个轮廓后,我用黑色背景遮罩从原始图像中裁剪出来。我不太确定如何将背景更改为白色,也不知道如何去除轮廓周围的黑色边缘。对图像进行阈值化似乎可以去除文本中的一些黑色像素,这是我不想要的 理想情况下,输出应该是简单的黑色文本和白色背景 这是我尝试的原始掩蔽代码中的一部分- mask=np.one(原img.shape).astype(原img.dtype) cv2.fillPoly(掩膜,[cnt]

我试图提取这个区域的文本以运行OCR,但是杂散的黑色边缘干扰了一些结果。有没有办法隔离这篇文章

找到这个轮廓后,我用黑色背景遮罩从原始图像中裁剪出来。我不太确定如何将背景更改为白色,也不知道如何去除轮廓周围的黑色边缘。对图像进行阈值化似乎可以去除文本中的一些黑色像素,这是我不想要的

理想情况下,输出应该是简单的黑色文本和白色背景

这是我尝试的原始掩蔽代码中的一部分-

mask=np.one(原img.shape).astype(原img.dtype)
cv2.fillPoly(掩膜,[cnt],(255255))
裁剪的轮廓=cv2.按位和(原始图像,遮罩)

要隔离文本,一种方法是获得所需ROI的边界框坐标,然后将该ROI遮罩到空白白色图像上。其主要思想是:

  • 将图像转换为灰度
  • 阈值图像
  • 展开图像以将文本作为单个边界框连接
  • 查找轮廓并过滤使用的轮廓区域以查找ROI
  • 将ROI放在面具上
阈值图像(左)然后放大以连接文本(右)

您可以使用
cv2.boundingRect()
查找轮廓,然后一旦获得ROI,就可以使用

mask = np.zeros(image.shape, dtype='uint8')
mask.fill(255)
mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]
找到轮廓,然后过滤ROI(左),最终结果(右)

根据图像大小,可能需要调整轮廓区域的过滤器

import cv2
import numpy as np

original_image = cv2.imread('1.png')
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(thresh, kernel, iterations=5)

# Find contours
cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Create a blank white mask
mask = np.zeros(image.shape, dtype='uint8')
mask.fill(255)

# Iterate thorugh contours and filter for ROI
for c in cnts:
    area = cv2.contourArea(c)
    if area < 15000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]

cv2.imshow("mask", mask)
cv2.imshow("image", image)
cv2.imshow("dilate", dilate)
cv2.imshow("thresh", thresh)
cv2.imshow("result", image)
cv2.waitKey(0)
导入cv2
将numpy作为np导入
原始图像=cv2.imread('1.png')
image=original\u image.copy()
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
thresh=cv2.阈值(灰色,0,255,cv2.thresh_BINARY_INV | cv2.thresh_OTSU)[1]
kernel=cv2.getStructuringElement(cv2.morp_RECT,(5,5))
扩张=cv2。扩张(阈值、内核、迭代次数=5)
#寻找轮廓
cnts=cv2.查找对象(扩张、cv2.RETR\u树、cv2.链近似\u简单)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
#创建一个空白的白色遮罩
mask=np.zero(image.shape,dtype='uint8')
掩码填充(255)
#迭代thorugh轮廓并过滤ROI
对于碳纳米管中的碳:
面积=cv2。轮廓面积(c)
如果面积小于15000:
x、 y,w,h=cv2.boundingRect(c)
cv2.矩形(图像,(x,y),(x+w,y+h),(36255,12),2)
遮罩[y:y+h,x:x+w]=原始_图像[y:y+h,x:x+w]
cv2.imshow(“面具”,面具)
cv2.imshow(“图像”,图像)
cv2.imshow(“扩张”,扩张)
cv2.imshow(“脱粒”,脱粒)
cv2.imshow(“结果”,图像)
cv2.等待键(0)

要隔离文本,一种方法是获得所需ROI的边界框坐标,然后将该ROI遮罩到空白白色图像上。其主要思想是:

  • 将图像转换为灰度
  • 阈值图像
  • 展开图像以将文本作为单个边界框连接
  • 查找轮廓并过滤使用的轮廓区域以查找ROI
  • 将ROI放在面具上
阈值图像(左)然后放大以连接文本(右)

您可以使用
cv2.boundingRect()
查找轮廓,然后一旦获得ROI,就可以使用

mask = np.zeros(image.shape, dtype='uint8')
mask.fill(255)
mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]
找到轮廓,然后过滤ROI(左),最终结果(右)

根据图像大小,可能需要调整轮廓区域的过滤器

import cv2
import numpy as np

original_image = cv2.imread('1.png')
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(thresh, kernel, iterations=5)

# Find contours
cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Create a blank white mask
mask = np.zeros(image.shape, dtype='uint8')
mask.fill(255)

# Iterate thorugh contours and filter for ROI
for c in cnts:
    area = cv2.contourArea(c)
    if area < 15000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]

cv2.imshow("mask", mask)
cv2.imshow("image", image)
cv2.imshow("dilate", dilate)
cv2.imshow("thresh", thresh)
cv2.imshow("result", image)
cv2.waitKey(0)
导入cv2
将numpy作为np导入
原始图像=cv2.imread('1.png')
image=original\u image.copy()
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
thresh=cv2.阈值(灰色,0,255,cv2.thresh_BINARY_INV | cv2.thresh_OTSU)[1]
kernel=cv2.getStructuringElement(cv2.morp_RECT,(5,5))
扩张=cv2。扩张(阈值、内核、迭代次数=5)
#寻找轮廓
cnts=cv2.查找对象(扩张、cv2.RETR\u树、cv2.链近似\u简单)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
#创建一个空白的白色遮罩
mask=np.zero(image.shape,dtype='uint8')
掩码填充(255)
#迭代thorugh轮廓并过滤ROI
对于碳纳米管中的碳:
面积=cv2。轮廓面积(c)
如果面积小于15000:
x、 y,w,h=cv2.boundingRect(c)
cv2.矩形(图像,(x,y),(x+w,y+h),(36255,12),2)
遮罩[y:y+h,x:x+w]=原始_图像[y:y+h,x:x+w]
cv2.imshow(“面具”,面具)
cv2.imshow(“图像”,图像)
cv2.imshow(“扩张”,扩张)
cv2.imshow(“脱粒”,脱粒)
cv2.imshow(“结果”,图像)
cv2.等待键(0)

谢谢!放大然后找到文本本身的边界框是非常直观的。我想知道如果文本以某种方式接触多边形的边缘(或者几乎不接触它),这是否会是一个问题。然后放大文本可能没有轮廓,因为文本将连接到白色背景。如果文本靠近边缘,则可能会遇到问题,因为它与外部合并。如果文本连接到背景,则很难找到ROI谢谢!放大然后找到文本本身的边界框是非常直观的。我想知道如果文本以某种方式接触多边形的边缘(或者几乎不接触它),这是否会是一个问题。然后放大文本可能没有轮廓,因为文本将连接到白色背景。如果文本靠近边缘,则可能会遇到问题,因为它与外部合并。如果文本连接到背景,则很难找到ROI