![](/img/trans.png)
[英]Converting a PIL image in python to grayscale pixel by pixel, leaving 1 color alone
[英]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,这是结果,但它们还不够好
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.