我正在使用for循环迭代jpg图像。图像如下所示。
图像是我在大学这个学期的时间表。如您所见,有绿色单元格,黄色单元格和浅棕色单元格。我有每种颜色的 RGB 值。
我的任务是找到第一个绿色或黄色或浅棕色像素。实际上,我想找出时间表中第一个插槽的左上角(通知:星期一的第一个类,在我的情况下是绿色,但对于空插槽是黄色的。 )
这是我写的迭代图像并找出第一个点的坐标的绿色或黄色的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)
下面的图片是上面的时间表,带有两个带圆圈的区域:红色圆圈突出显示我期望输出坐标的区域,以及蓝色圆圈突出显示程序实际定位坐标的区域。
我的逻辑是,无论何时找到绿色或黄色像素,迭代按列完成,循环应该断开,它断开的点是我的输出。红色区域是我希望程序找到坐标的地方。
Expected output: around [117,101]
Obtained output: [982, 99]
为什么会发生这种情况?我的图像迭代是错误的还是以某种方式获得随机化?我应该做些什么改变才能获得所需的输出?
答案 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个像素,然后才能得出颜色表示您想要的框。