我正在做一个项目,其中涉及校园周围标志的彩色图片。我需要抓住标牌并在标牌上标记数字。
到目前为止,我一直在拍摄图像,将其转换为灰度,对其进行过滤/锐化。然后阈值抓住标志。在大多数情况下,这是可行的,因为符号为黑色,文本为白色。
但是,有些图像中有暗阴影,加上明亮的阳光,使阴影中的某些背景部分比黑色符号暗。
因此,没有阈值保持值可以将符号与背景隔离。
所以我的问题是,有没有一种方法可以对图像进行预处理,以便将所有彩色部分,甚至是真正的深色部分(例如深棕色/红色)都设置为255。然后根据阈值将其全部设置为黑色部分设置为0,白色部分设置为255。
我知道白色,黑色和灰色的bgr值都差不多,因此肯定应该有一种方法。
非常抱歉,我无法直接链接图像,我的积分不足。
答案 0 :(得分:1)
您可以将图像转换为HSV-色相,饱和度,值。色相定义颜色,饱和度定义颜色的强度,并定义亮度。黑色/灰色/白色值的饱和度很小,因此您可以使用该属性删除背景。
这是HSV可视化效果:
您希望所有值都在圆柱体的“核心”中。
代码:
import cv2
import numpy as np
# load image
img = cv2.imread("0hfSa20.png")
# Convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# define range wanted color in HSV
lower_val = np.array([0,0,0]) #full black RGB = 0,0,0
upper_val = np.array([179,58,255]) # all hue, all value, cap saturation at 58
# Threshold the HSV image to get only grayish colors
mask = cv2.inRange(hsv, lower_val, upper_val)
# apply mask to image
res = cv2.bitwise_and(img,img,mask=mask)
# display image
cv2.imshow("Res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
HSV也非常适合过滤颜色。如果您想尝试价值观并学习理解HSV,this script会很有帮助。
答案 1 :(得分:0)
我喜欢@ J.D.s Answer。非常聪明。
作为一种替代解决方案,自适应高斯阈值对我有效(常规自适应阈值也是如此)。但是出现了意外的变化:我使用了负常量C
:
import cv2
image = cv2.imread('311.png', 0)
image = cv2.adaptiveThreshold(image,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 17, -6)
cv2.imwrite('311_thresh.png', image)
image = cv2.imread('109.png', 0)
image = cv2.adaptiveThreshold(image,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 17, -6)
cv2.imwrite('109_thresh.png', image)
311_thresh.png:
109_thresh.png: