这是我正在尝试做的事情:
我有一张照片。
我想在图像中采用圆形区域,并使其显示为正常。
图像的其余部分应显得更暗。
这样,就好像圆形区域被“突出显示”一样。
我非常感谢有关如何在Python中执行此操作的反馈。
手动,在Gimp中,我会创建一个颜色为灰色(小于中灰色)的新图层。然后我会在该层上创建一个循环区域,并使其为中灰色。然后我会将混合模式更改为柔和光线。从本质上讲,顶层中灰色的任何东西都会在没有修改的情况下显示出来,任何比中间灰色更暗的东西都会显得更暗。
(理想情况下,我还会模糊顶层,以便过渡不会突然)。
如何在Python中以算法方式执行此操作?我考虑使用Pillow库,但它没有这些混合模式。我也考虑使用Blit库,但我无法导入(不确定它是否已经维护)。我也对scikit-image持开放态度。我只需要关于库和一些相关函数的指针。
如果没有合适的库,我可以从Python代码中调用命令行工具(例如imagemagick)。
谢谢!
答案 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))
答案 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