以编程方式删除Apple Screen Capture Shadow边框

时间:2013-08-17 20:58:46

标签: python image-processing pillow

内置的MacOS屏幕捕获程序(命令移位4)有一个很好的功能,你可以点击空格键并捕获一个窗口,如下所示:

enter image description here

我想以编程方式查看图像目录(它们是PNG),确定它们是否有阴影,然后自动裁剪。我需要这个在Mac上运行。我想用Python写这个。有人告诉我Pillow是用Python管理图像的正确方法,但我不知道如何读取单个像素和裁剪图像。

2 个答案:

答案 0 :(得分:0)

以下是一些建议,无论您将使用哪个库。

窗口上有不变量:4个角,标题栏大致颜色均匀,3个圆盘形按钮。

如果您可以检测到按钮和标题栏,则可以轻松找到顶角。底角与顶角对称。

可能的解决方案

  • 应用Hough transform查找圈子
  • 沿水平轴(按钮)找到3个连续的圆圈
  • 应用Hough变换查找垂直和水平线
  • 查找包含3个圆圈(标题栏)的四边形
  • 窗口的2个顶角位于标题栏的顶角附近。
  • 通过拐角处的街区形成补丁
  • 在补丁中应用edge detection算法
  • 垂直反映贴片的像素
  • 垂直应用补丁。例如DP
  • 重复2个顶角的匹配以找到底部角落

使用4角,你知道窗口的边界框,你可以解决裁剪问题

答案 1 :(得分:0)

以下是使用Python Image Library和Python 2.7执行此操作的代码:

#!/usr/bin/env                                                                                                                       
# Removes the shadow from MacOS-Generated screen shots.                                                                              

import Image,os

if __name__=="__main__":
    image = Image.open(os.sys.argv[1])
    image = image.convert('RGBA')

    (width,height) = image.size
    def find_first_non_alpha_x():
        for i in range(width):
            if image.getpixel((i,height/2))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    def find_last_non_alpha_x():
        for i in range(width-1,0,-1):
            if image.getpixel((i,height/2))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    def find_first_non_alpha_y():
        for i in range(height):
            if image.getpixel((width/2,i))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    def find_last_non_alpha_y():
        for i in range(height-1,0,-1):
            if image.getpixel((width/2,i))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    x1 = find_first_non_alpha_x()
    y1 = find_first_non_alpha_y()
    x2  = find_last_non_alpha_x()
    y2  = find_last_non_alpha_y()

    y = image.crop((x1-1,y1-1,x2+1,y2+1))
    y.save(os.sys.argv[1]+"-cropped.png")