代码之家  ›  专栏  ›  技术社区  ›  Aaron Digulla

我怎么能把一个图像蓝框起来?

  •  0
  • Aaron Digulla  · 技术社区  · 16 年前

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

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

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Dani van der Meer    16 年前

    比起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)
    

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

        2
  •  1
  •   Paul    16 年前

    我想让一个任意的背景色透明前一段时间,并开发了这个脚本。它采用图像中最流行的(背景)颜色,并创建透明度与背景色的距离成比例的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')
    
        3
  •  1
  •   Mark Setchell    11 年前

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

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

    它转换成:

    enter image description here

    enter image description here

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

    convert text.jpg -colors 2 -colorspace RGB -format %c histogram:info:-
     5894: ( 50, 49, 19) #323113 rgb(50,49,19)
    19162: (186,187, 87) #BABB57 rgb(186,187,87)       <- THIS ONE !
    

    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