Python+OpenCV实现文字颜色识别与矩形标定
本文介绍使用Python和OpenCV进行图像中文字颜色识别及矩形标定的实现方法。通过设定HSV空间下的红、黑、黄三色阈值提取对应文字,并结合中值滤波、开操作与闭操作去除噪声及修复断裂,最终完成对特定颜色文字的精准定位与标注。
Python+OpenCV实现文字颜色识别与矩形标定
近期处理了一个相对基础的图像处理任务,耗时较短完成了代码编写:
测试数据集由客户自行创建,非标准公开数据集:

具体实现代码如下:
核心代码实现
"""
Code creation time:September 11, 2021
Author:PanBo
Realize function:It mainly realizes the recognition and calibration of fonts with different colors
"""
import numpy as np
import cv2 as cv
font = cv.FONT_HERSHEY_SIMPLEX
lower_red = np.array([0, 120, 120])
hight_red = np.array([10, 255, 255])
#
lower_black = np.array([0, 0, 0])
height_black = np.array([144, 144, 144])
lower_yellow = np.array([10, 230, 230])
height_yellow = np.array([35, 255, 255])
frame = cv.imread("test.png")
cv.namedWindow("test_image", cv.WINDOW_AUTOSIZE)
cv.imshow('test_image', frame)
img_hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
mask_red = cv.inRange(img_hsv, lower_red, hight_red)
mask_black = cv.inRange(img_hsv, lower_black, height_black)
mask_yellow = cv.inRange(img_hsv, lower_yellow, height_yellow)
cv.namedWindow("mask_red", cv.WINDOW_AUTOSIZE)
cv.imshow("mask_red", mask_red)
cv.namedWindow("mask_black", cv.WINDOW_AUTOSIZE)
cv.imshow("mask_black", mask_black)
cv.namedWindow("mask_yellow", cv.WINDOW_AUTOSIZE)
cv.imshow("mask_yellow", mask_yellow)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
mask_yellow = cv.morphologyEx(mask_yellow, cv.MORPH_OPEN, kernel)
cv.namedWindow("mask_yellow_open", cv.WINDOW_AUTOSIZE)
cv.imshow("mask_yellow_open", mask_yellow)
mask_yellow = cv.morphologyEx(mask_yellow, cv.MORPH_CLOSE, kernel)
cv.namedWindow("mask_yellow_close", cv.WINDOW_AUTOSIZE)
cv.imshow("mask_yellow_close", mask_yellow)
mask_black = cv.medianBlur(mask_black, 3)
mask_red = cv.medianBlur(mask_red, 3)
mask_yellow = cv.medianBlur(mask_yellow, 3)
# cv.imshow(" ", mask_green)
cnts1, hierarchy1 = cv.findContours(mask_black, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
cnts2, hierarchy2 = cv.findContours(mask_red, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
cnts3, hierarchy3 = cv.findContours(mask_yellow, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
for cnt in cnts1:
(x, y, w, h) = cv.boundingRect(cnt)
cv.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 0), 2)
cv.putText(frame, 'black', (x, y-5), font, 0.7, (0, 0, 25),2)
for cnt in cnts2:
(x, y, w, h) = cv.boundingRect(cnt)
cv.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.putText(frame, 'red', (x, y - 5), font, 0.7, (0, 0, 255), 2)
for cnt in cnts3:
(x, y, w, h) = cv.boundingRect(cnt)
cv.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.putText(frame, 'yellow', (x, y - 5), font, 0.7, (0, 0, 255), 2)
cv.namedWindow("output", cv.WINDOW_AUTOSIZE)
cv.imshow("output", frame)
cv.waitKey(0)
颜色阈值提取与初步检测
首先设定字体颜色的上下限阈值,进而提取出红色、黑色以及黄色的文字区域,效果如下所示:
在原始图像中检测到的红色文字内容为数字“四”和“五”。

在原始图像中检测到的黑色文字内容为汉字“一”和“大”。

在原始图像中检测到的黄色文字内容为数字“七”和“九”。

噪声处理与形态学优化
在进行黄色文字检测时,发现存在椒盐噪声干扰,因此引入了中值滤波进行去噪处理。
然而单一滤波效果不佳,进一步采用了形态学中的开操作进行优化,处理结果如下:

观察发现,数字“七”和“九”出现了断裂现象,若直接进行矩形标定会导致生成两个独立的矩形框,因此继续采用形态学中的闭操作进行修复,结果如下:

经过闭操作后,“七”处的裂缝得以修复,但“九”仍存在断裂,这主要归因于黄色上下阈值的设置范围影响。
最终矩形标定结果
随后进行最终的矩形标定,效果如下所示:

至此,关于利用Python和OpenCV实现文字颜色识别与标定的内容介绍完毕。如需了解更多相关技术细节,可查阅本站过往文章或继续浏览后续内容,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









