gpt4 book ai didi

python - 获取黑色背景上的白色文本

转载 作者:行者123 更新时间:2023-11-30 21:53:12 25 4
gpt4 key购买 nike

我想识别一组图像中的文本。有些图像同时带有白色和黑色文本。

enter image description here

我使用大津阈值对图像进行二值化

enter image description here

轮廓识别并删除非文本区域后,我确定了所需的文本区域。

enter image description here

我需要所有白色文本。但我不知道该怎么做。我想过使用按位运算符,但找不到方法。有人可以帮我解决这个问题吗?

预期输出:

enter image description here

import cv2
import numpy as np


def process(img):
# read image
img_no = str(img)
rgb = cv2.imread(img_no + '.jpg')
# cv2.imshow('original', rgb)

# convert image to grayscale
gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)

_, bw_copy = cv2.threshold(gray, 0.0, 255.0, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# bilateral filter
blur = cv2.bilateralFilter(gray, 5, 75, 75)
# cv2.imshow('blur', blur)

# morphological gradient calculation
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
grad = cv2.morphologyEx(blur, cv2.MORPH_GRADIENT, kernel)
# cv2.imshow('gradient', grad)

# binarization
_, bw = cv2.threshold(grad, 0.0, 255.0, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# cv2.imshow('otsu', bw)

# closing
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 1))
closed = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel)
# cv2.imshow('closed', closed)

# finding contours
contours, hierarchy = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

mask = np.zeros(closed.shape, dtype=np.uint8)
mask1 = np.zeros(bw_copy.shape, dtype=np.uint8)

for idx in range(len(contours)):
x, y, w, h = cv2.boundingRect(contours[idx])
mask[y:y + h, x:x + w] = 0
area = cv2.contourArea(contours[idx])
aspect_ratio = float(w) / h
cv2.drawContours(mask, contours, idx, (255, 255, 255), -1)
r = float(cv2.countNonZero(mask[y:y + h, x:x + w])) / (w * h)

# identify region of interest
if r > 0.34 and 0.52 < aspect_ratio < 13 and area > 145.0:
cv2.drawContours(mask1, [contours[idx]], -1, (255, 255, 255), -1)

result = cv2.bitwise_and(bw_copy, mask1)
cv2.imshow('result', result)

print(img_no + " Done")
cv2.waitKey()

新图片

接受的答案不适用于此图片。

enter image description here

最佳答案

乍一看,这是一个简单的问题,但解决起来却相当棘手。然而,您已经拥有解决问题所需的所有要素,只需要对算法稍作调整。

以下是要点:

您需要的是阈值图像(bw_copy)的倒置图像(wb_copy)。

enter image description here

enter image description here

您在创建蒙版方面做得非常出色

enter image description here

使用上面的掩码对 bw_copy 和 wb_copy 运行 bitwise_and 运算。您应该得到如下所示的结果。

enter image description here

enter image description here

正如您所看到的,您的答案来自这两张图片。您需要做的就是对于每个字体 Blob ,计算两个图像中的非零像素,然后选择计数较高的一个。这样做将提供您想要的结果。

enter image description here

这是我对代码所做的修改

  # finding contours
_,contours,_ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

mask = np.zeros(closed.shape, dtype=np.uint8)
mask1 = np.zeros(bw_copy.shape, dtype=np.uint8)
wb_copy = cv2.bitwise_not(bw_copy)
new_bw = np.zeros(bw_copy.shape, dtype=np.uint8)

for idx in range(len(contours)):
x, y, w, h = cv2.boundingRect(contours[idx])
mask[y:y + h, x:x + w] = 0
area = cv2.contourArea(contours[idx])
aspect_ratio = float(w) / h
cv2.drawContours(mask, contours, idx, (255, 255, 255), -1)
r = float(cv2.countNonZero(mask[y:y + h, x:x + w])) / (w * h)


# identify region of interest
if r > 0.34 and 0.52 < aspect_ratio < 13 and area > 145.0:

cv2.drawContours(mask1, [contours[idx]], -1, (255, 255, 255), -1)

bw_temp = cv2.bitwise_and(mask1[y:y + h, x:x + w],bw_copy[y:y + h, x:x + w])
wb_temp = cv2.bitwise_and(mask1[y:y + h, x:x + w],wb_copy[y:y + h, x:x + w])

bw_count = cv2.countNonZero(bw_temp)
wb_count = cv2.countNonZero(wb_temp)

if bw_count > wb_count:
new_bw[y:y + h, x:x + w]=np.copy(bw_copy[y:y + h, x:x + w])
else:
new_bw[y:y + h, x:x + w]=np.copy(wb_copy[y:y + h, x:x + w])

cv2.imshow('new_bw', new_bw)

关于python - 获取黑色背景上的白色文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59745730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com