使用Python

时间:2015-11-09 06:03:00

标签: python image-processing

这是我正在尝试做的事情:

我有一张照片。

我想在图像中采用圆形区域,并使其显示为正常。

图像的其余部分应显得更暗。

这样,就好像圆形区域被“突出显示”一样。

我非常感谢有关如何在Python中执行此操作的反馈。

手动,在Gimp中,我会创建一个颜色为灰色(小于中灰色)的新图层。然后我会在该层上创建一个循环区域,并使其为中灰色。然后我会将混合模式更改为柔和光线。从本质上讲,顶层中灰色的任何东西都会在没有修改的情况下显示出来,任何比中间灰色更暗的东西都会显得更暗。

(理想情况下,我还会模糊顶层,以便过渡不会突然)。

如何在Python中以算法方式执行此操作?我考虑使用Pillow库,但它没有这些混合模式。我也考虑使用Blit库,但我无法导入(不确定它是否已经维护)。我也对scikit-image持开放态度。我只需要关于库和一些相关函数的指针。

如果没有合适的库,我可以从Python代码中调用命令行工具(例如imagemagick)。

谢谢!

2 个答案:

答案 0 :(得分:1)

您也可以使用Python Image Library执行此操作。这是一种有效的方法,但可能会进行优化,因为它中仍有一个for循环。

from PIL import Image
import math

def spotlight(img: Image, center: (int, int), radius: int) -> Image:
    width, height = img.size
    overlay_color = (0, 0, 0, 128)
    img_overlay = Image.new(size=img.size, color=overlay_color, mode='RGBA')
    for x in range(width):
        for y in range(height):
            dx = x - center[0]
            dy = y - center[1]
            distance = math.sqrt(dx * dx + dy * dy)
            if distance < radius:
                img_overlay.putpixel((x, y), (0, 0, 0, 0))
    img.paste(img_overlay, None, mask=img_overlay)
    return img


if __name__ == '__main__':
    orig_file_name = 'amsterdam_1900x1500'
    img = Image.open('{}.jpg'.format(orig_file_name))
    spotlight_img = spotlight(img, (475, 900), 400)
    spotlight_img.save('spotlight_{}.jpg'.format(orig_file_name))

在: amsterdam_1900x1500.jpg

在: spotlight_amsterdam_1900x1500.jpg

答案 1 :(得分:0)

我终于使用ImageMagick,使用Python来计算各种坐标等。

此命令将创建所需的圆(半径400,以(600,600)为中心:

convert -size 1024x1024 xc:none -stroke black -fill steelblue -strokewidth 1 -draw "translate 600,600 circle 0,0 400,0" drawn.png

然后,此命令将其转换为B / W以获得基本掩码:

convert drawn.png -alpha extract mask.png

此命令将模糊蒙版(半径180,西格玛16):

convert -channel RGBA -blur 100x16 mask.png mask2.png

以上三个命令给了我需要的面具。

此命令会使整个图像变暗(没有蒙版):

convert image.jpg -level 0%,130%,0.7 dark.jpg

此命令将所有3个图像放在一起(原始图像,暗图像和蒙版):

composite image.jpg dark.jpg mask2.png out.jpg