繁体   English   中英

PYTHON PIL:从图像中删除除文本之外的所有内容(基于像素颜色)

[英]PYTHON PIL: remove everything from image except text (based on pixel color)

我有一些带有字幕/文本的图像,我想从图片中删除所有内容,但要在上面设置清晰的文本,(最重要的是文本需要清晰且良好,以便任何 ocr 程序都可以读取它)。

- 在原始图像(1.png)中,文本应该是白色的,但这并不意味着它是 RGB:255,255,255,因此它因像素而异。 所以这是我无法找到获取文本的方法的问题。

也许我需要将 rgb 转换为不同的东西,也许是任何带有百分比或 idk 的值

我尝试使用以下代码将图像 1.png 转换为 2.png,这是结果,但它们还不够好

1.png: 在此处输入图像描述

2.png 在此处输入图像描述

RGB_min=[180,180,180]
RGB_max=[245,245,245]

def level(img):
    copy = img.copy()
    for x in range(img.size[0]):
        for y in range(img.size[1]):
            pxl = list(copy.getpixel((x, y)))
            # if pxl[0] < 220 and pxl[1] < 220: 
            if (pxl[0] < RGB_min[0] and pxl[1] < RGB_min[1]  ) or (pxl[0] > RGB_max[0] or pxl[1] >RGB_max[1]) : 
                pxl[0] = 255
                pxl[1] = 255
                pxl[2] = 255
            else:
                pxl[0] = 0
                pxl[1] = 0
                pxl[2] = 0
                
            copy.putpixel((x, y), tuple(pxl))
    return copy

image = Image.open('1.png')
leveled = level(image)
leveled.save('2.png')

如果放大,您可以在这里看到像素在文本中的情况。

在此处输入图像描述

您可以尝试在HSV色彩空间中寻找明亮的值,如下所示:

from PIL import Image

# Load image and convert to HSV
im = Image.open('t6FkL.png').convert('HSV')

# Split channels, just retaining the Value channel
_, _, V = im.split()

# Select pixels where V>220
res = V.point(lambda p: p > 220 and 255)
res.save('result.png')

在此处输入图像描述


这是编写point()函数来处理复合逻辑的一种可能更直观的方法:

#!/usr/bin/env python3

from PIL import Image

# Build a linear gradient 0..255
im = Image.linear_gradient('L')

# Save how it looks initially just for debug
im.save('DEBUG-start.png')

# Make all pixels between 180..220 black, leaving others as they were
res = im.point(lambda p: 0 if p>180 and p<220 else p)

# Save result
res.save('result.png')

这是开始图像:

在此处输入图像描述

处理后的图像:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM