Python:为啥我的代码没有正确裁剪选定的图像?

Posted

技术标签:

【中文标题】Python:为啥我的代码没有正确裁剪选定的图像?【英文标题】:Python: Why is my code not cropping a selected image properly?Python:为什么我的代码没有正确裁剪选定的图像? 【发布时间】:2015-08-29 15:24:39 【问题描述】:

我正在尝试编写一个 python 程序来裁剪图像以删除额外的空白。为此,我正在遍历整个图像以查找最左侧、最右侧、最顶部和最底部的像素,以识别裁剪所需的边界。我的代码在左侧、右侧和底部边界上遗漏了一些像素。给出的第一个图像是源图像,另一个是结果图像。

这是我的代码:

import PIL
from PIL import Image
import os

bw = Image.open('abw.png')
width, height = bw.size
top, bottom, left,right = 100,-10,100,-10 #The given image 90x90
for x in range(height):
    for y in range(width):
        if(bw.getpixel((x,y))<255):
            #if black pixel is found
            if(y<left):
                left = y
            if(y>right):
                right = y
            if(x<top):
                top = x
            if(x>bottom):
                bottom = x

bw.crop((left,top,right,bottom)).save('abw1.png')

有人能找出我代码中的问题吗?

【问题讨论】:

你想用for循环实现什么?你能详细说明一下吗? For 循环遍历图像并寻找有用的边界值。正如您在这张图片中看到的那样,它周围有不必要的额外空白。 【参考方案1】:

您上传的图片是 JPG,而不是 PNG,因此其中可能存在一些解码伪影 该算法将非常浅的灰色像素与黑色像素混淆。因此,我引入了一个阈值。

主要问题似乎是您交换了 xy

我清理了一些格式 (PEP8)。

以下代码在您的测试图像(另存为 JPG)上运行良好。

import PIL
from PIL import Image

threshold = 220 # Everything below threshold is considered black.

bw = Image.open('abw.jpg')
width, height = bw.size
top = bottom = left = right = None
for y in range(height):
    for x in range(width):
        if bw.getpixel((x,y)) < threshold:
            # if black-ish pixel is found
            if (left is None) or (x < left):
                left = x
            if (right is None) or (x > right):
                right = x
            if (top is None) or (y < top):
                top = y
            if (bottom is None) or (y > bottom):
                bottom = y

im = bw.crop((left, top, right + 1, bottom + 1))
im.show()

【讨论】:

谢谢。有效!但是你为什么要把右和下加 1 呢? 因为我的印象是最右边的列和底行不包括在裁剪的图像中。变量“底部”将包含找到黑色像素的最低行的 y 坐标,并且它具有黑色像素这一事实意味着您希望该行出现在输出中。

以上是关于Python:为啥我的代码没有正确裁剪选定的图像?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery图像裁剪问题 - 显示图像的另一部分而不是选定的

为啥裁剪后的图像颜色会变深?

Python and OpenCV - 为啥用 OpenCV 处理的裁剪图像仍然可以影响原始图像?

为啥裁剪图像后会出现黑色区域​​?

为啥我裁剪的图像很小?

如何使用 jcrop 裁剪正确的图像