阈值图像的方式相同

时间:2018-01-14 08:28:13

标签: python opencv image-thresholding

无论颜色变化如何,我都希望对图像进行阈值处理。 例如:

input image

我想在输入中对这两个字母进行阈值处理并在输出中显示。但是当我对图像进行阈值处理时,只显示一个字母。我怎么能用Opencv和Python做到这一点?

附加信息示例:new example示例的两个输入图像显示一个图像的字母颜色比背景颜色浅,而另一个图像的字母颜色比较暗。我想要的是对这两个图像进行阈值以获得相同的输出。 (白色背景中的黑色字母)

3 个答案:

答案 0 :(得分:1)

如果您直接将此彩色图像转换为灰色并对其进行阈值处理,那么您将获得此图像。它不适合两个A

的阈值

enter image description here

但是如果你在BGR中拆分频道,你会得到这个:

enter image description here

显然,B频道的阈值可行。

enter image description here

#!/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)

答案 1 :(得分:0)

如果您的背景是恒定颜色,则可以搜索精确或非常接近的匹配并从中创建新图像。无论颜色在哪里,背景颜色都设置为白色像素,否则设置为黑色像素。不需要阈值处理。

这是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)

enter image description here

答案 2 :(得分:0)

如果您知道背景颜色是恒定的,则可以创建非背景颜色的二进制图像。

out = im != BG_COLOR

import cv2
im = cv2.imread(r"A.png")
BG_COLOR = im[0:0]

out = im != BG_COLOR

cv2.imwrite("A_masked.png", out * 255) # make it 8bit for output

输出被遮罩的图像:

enter image description here