for循环跳过图片

时间:2018-04-01 06:15:11

标签: python python-3.x image-processing

我正在使用for循环迭代jpg图像。图像如下所示。

图像是我在大学这个学期的时间表。如您所见,有绿色单元格,黄色单元格和浅棕色单元格。我有每种颜色的 RGB 值。

我的任务是找到第一个绿色黄色浅棕色像素。实际上,我想找出时间表中第一个插槽的左上角(通知:星期一的第一个类,在我的情况下是绿色,但对于空插槽是黄色的。 )

enter image description here

这是我写的迭代图像并找出第一个点的坐标的绿色或黄色的python代码。

from PIL import Image
tt = Image.open("tt.jpg")
dim = tt.size
filled_slot = (203, 254, 51) #RGB values of green
empty_slot = ((255, 255, 203), (248, 239, 164))
             #RGB of yellow     RGB of light brown

start = [] #coordinates of the first pixel in the timetable

for i in range(dim[0]):
    for j in range(dim[1]):
       rgb = tt.getpixel((i,j))
       if rgb == filled_slot or rgb == empty_slot[0]:
           start = [i,j]
           break

print(start)

下面的图片是上面的时间表,带有两个带圆圈的区域:红色圆圈突出显示我期望输出坐标的区域,以及蓝色圆圈突出显示程序实际定位坐标的区域。

我的逻辑是,无论何时找到绿色或黄色像素,迭代按列完成,循环应该断开,它断开的点是我的输出。红色区域是我希望程序找到坐标的地方。

enter image description here

Expected output: around [117,101]
Obtained output: [982, 99]

为什么会发生这种情况?我的图像迭代是错误的还是以某种方式获得随机化?我应该做些什么改变才能获得所需的输出?

2 个答案:

答案 0 :(得分:1)

您只能打破内部循环,但继续搜索列。最好,写一个函数并直接返回结果:

from PIL import Image
filled_slot = (203, 254, 51) #RGB values of green
empty_slot = ((255, 255, 203), (248, 239, 164))
             #RGB of yellow     RGB of light brown

def find_first_pixel(image, colors):
    dim = image.size
    for i in range(dim[0]):
        for j in range(dim[1]):
            rgb = image.getpixel((i,j))
            if rgb in colors:
                return [i,j]
    return None

tt = Image.open("tt.jpg")
print(find_first_pixel(tt, (filled_slot, empty_slot[0]))

答案 1 :(得分:1)

问题在于您的数据,而不是您的代码。你的迭代是正确的(虽然丹尼尔指出,效率低下)并且Python没有随机化你的坐标。

颜色在黑色数字周围像素化。如果您在start的左侧和右侧打印出像素的颜色,您会看到它们是(251, 254, 207)(255, 255, 201)。放大600x或以上的图像,你会发现丁香和蓝色框中的数字周围有黄色像素。

您可能需要搜索相同颜色的更大区域,比如一行5个像素,然后才能得出颜色表示您想要的框。