无论颜色变化如何,我都想对图像进行阈值处理。前任:
我想在输入中对这两个字母设置阈值并在输出中显示。但是当我对图像进行阈值处理时,只显示一个字母。如何使用 Opencv 和 Python 做到这一点?
带有示例的附加信息:新示例示例的两个输入图像显示一个图像的字母颜色比背景颜色浅,而另一个图像的字母颜色较深。我想要的是对这两个图像进行阈值化以获得相同的输出。(白底黑字)
无论颜色变化如何,我都想对图像进行阈值处理。前任:
我想在输入中对这两个字母设置阈值并在输出中显示。但是当我对图像进行阈值处理时,只显示一个字母。如何使用 Opencv 和 Python 做到这一点?
带有示例的附加信息:新示例示例的两个输入图像显示一个图像的字母颜色比背景颜色浅,而另一个图像的字母颜色较深。我想要的是对这两个图像进行阈值化以获得相同的输出。(白底黑字)
如果您直接将此彩色图像转换为灰色并对其进行阈值处理,那么您将得到这个。它不适合阈值两者A
:
但是,如果您将频道拆分为BGR
,您将得到以下信息:
显然,阈值B
通道将起作用。
#!/usr/bin/python3
# 2018.01.14 16:31:39 CST
# 2018.01.14 16:50:45 CST
import cv2
img = cv2.imread("img12.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
b,g,r = cv2.split(img)
th, threshed1 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
th, threshed2 = cv2.threshold(b, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imwrite("threshed_gray.png", threshed1)
cv2.imwrite("threshed_blue.png", threshed2)
如果您的背景是恒定颜色,您可以搜索完全匹配或非常接近的匹配并从中创建新图像。只要颜色是背景色,就设置一个白色像素,否则设置一个黑色像素。不需要阈值。
这是在 PIL 而不是 Opencv 中的样子:
from PIL import Image
im = Image.open(filename)
ld = im.load()
bg_r, bg_g, bg_b = ld[0,0]
for y in range(im.size[1]):
for x in range(im.size[0]):
r, g, b = ld[x,y]
if abs(r - bg_r) <= 1 and abs(g - bg_g) <= 1 and abs(b - bg_b) <= 1:
ld[x,y] = (255, 255, 255)
else:
ld[x,y] = (0, 0, 0)