我怎样才能把一个形象蓝框?

2024-05-18 21:23:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个扫描图像,基本上是黑色的打印在一些奇怪的(非灰色)背景上,比如说,绿色或黄色(想想旧报纸)。在

如何去除绿色/黄色,并接收到与原始图像相同多的灰色结构完整的灰色图片?一、 我想保持字母周围的灰色,以达到消除混叠效果或是灰色区域,但我想把任何一个甚至是遥远的绿色/黄色变成纯白色?在

请注意,背景绝不是均匀的;因此算法应该能够接受一种颜色和一个误差范围或一个颜色范围。在

加分:如何自动确定背景色?在

我想将Python与Imaging库或ImageMagick一起使用。在

注意:我知道像unpaper这样的包。我对unpaper的问题是,它产生的黑白图像可能对OCR软件很好,但对人眼不好。在


Tags: 图像区域颜色字母图片结构背景黑色
3条回答

我比Python程序员更喜欢C++,所以我不能给你一个代码示例。但一般的算法是这样的:

查找背景色: 你做一个图像的直方图。直方图应该有两个峰值,代表背景色和前景色。因为你知道背景有更高的强度,所以你选择强度更高的峰值,那就是背景色。 现在有了RGB背景(R_bg, G_bg, B_bg)

将背景设置为白色: 循环计算所有像素的距离:

distance = sqrt((R_bg - R_pixel) ^ 2 + (G_bg - G_pixel) ^ 2 + (B_bg - B_pixel) ^ 2)

如果距离小于阈值,则将像素设置为白色。你可以尝试不同的阈值,直到你得到一个好的结果。在

我知道这个问题很古老,但我和ImageMagick玩了一玩,试图做一些类似的事情,然后想到了这个:

convert text.jpg -fill white -fuzz 50% +opaque black out.jpg

它转换成:

enter image description here

在这方面:

enter image description here

至于“平均”颜色,我使用了:

^{pr2}$

这是什么颜色:

enter image description here

经过更多的实验,我可以得到:

enter image description here

使用这个:

convert text.jpg -fill black -fuzz 50% -opaque rgb\(50,50,10\) -fill white +opaque black out.jpg

我想让一个任意的背景色透明前一段时间,并开发了这个脚本。它采用图像中最流行的(背景)颜色,并创建透明度与背景色的距离成比例的alpha遮罩。对于大图像来说,获取RGB颜色空间距离是一个昂贵的过程,因此我尝试了一些使用numpy和快速整数sqrt近似操作的优化。首先转换成HSV可能是正确的方法。如果我没帮你解决这个问题:

from PIL import Image
import sys, time, numpy

fldr = r'C:\python_apps'
fp = fldr+'\\IMG_0377.jpg'

rz = 0  # 2 will halve the size of the image, etc..

#         

im = Image.open(fp)

if rz:
    w,h = im.size
    im = im.resize((w/rz,h/rz))
    w,h = im.size

h = im.histogram()
rgb = r0,g0,b0 = [b.index(max(b)) for b in [ h[i*256:(i+1)*256] for i in range(3) ]]

def isqrt(n):
    xn = 1
    xn1 = (xn + n/xn)/2
    while abs(xn1 - xn) > 1:
        xn = xn1
        xn1 = (xn + n/xn)/2
    while xn1*xn1 > n:
        xn1 -= 1
    return xn1

vsqrt = numpy.vectorize(isqrt)

def dist(image):
    imarr = numpy.asarray(image, dtype=numpy.int32)  # dtype=numpy.int8
    d = (imarr[:,:,0]-r0)**2 + (imarr[:,:,1]-g0)**2 + (imarr[:,:,2]-b0)**2
    d = numpy.asarray((vsqrt(d)).clip(0,255), dtype=numpy.uint8)
    return Image.fromarray(d,'L')

im.putalpha(dist(im))
im.save(fldr+'\\test.png')

相关问题 更多 >

    热门问题