Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于循环跳过图像中的像素_Python_Python 3.x_Image Processing - Fatal编程技术网

Python 用于循环跳过图像中的像素

Python 用于循环跳过图像中的像素,python,python-3.x,image-processing,Python,Python 3.x,Image Processing,我使用for循环来迭代jpg图像。下图所示 这张图片是我在大学这学期的时间表。如您所见,有绿色细胞、黄色细胞和浅棕色细胞。我有每种颜色的RGB值 我的任务是定位第一个绿色或黄色或浅棕色像素。实际上,我想找出时刻表中第一个时段的左上角(注意:周一的第一节课,在我的情况下,它是绿色的,但对于一个空时段,它将是黄色的。) 下面是我编写的python代码,用于迭代图像并找出第一个点(绿色或黄色)的坐标 from PIL import Image tt = Image.open("tt.jpg") di

我使用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)
下图是上面的时间表,带有两个圆圈区域:红色圆圈突出显示我预期输出坐标所在的区域,蓝色圆圈突出显示程序实际定位坐标所在的区域

我的逻辑是,每当一个绿色或黄色像素被定位时,循环应该中断,中断的点就是我的输出。红色圆圈的区域是我希望程序找到坐标的地方


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

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

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]))

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

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]))

问题在于数据,而不是代码。您的迭代是正确的(尽管正如Daniel指出的,效率很低),Python不会随机化您的坐标

颜色是围绕黑色数字的像素化。如果在
开始
的左右两侧打印出像素的颜色,您将看到它们是
(251254207)
(255,255,201)
。放大600倍或以上的图像,你会看到淡紫色和蓝色框中的数字周围有黄色像素


您可能需要搜索相同颜色的较大区域,例如一行5个像素,然后才能确定颜色是否表示所需的框

问题在于数据,而不是代码。您的迭代是正确的(尽管正如Daniel指出的,效率很低),Python不会随机化您的坐标

颜色是围绕黑色数字的像素化。如果在
开始
的左右两侧打印出像素的颜色,您将看到它们是
(251254207)
(255,255,201)
。放大600倍或以上的图像,你会看到淡紫色和蓝色框中的数字周围有黄色像素


您可能需要搜索相同颜色的较大区域,例如一行5个像素,然后才能确定颜色是否表示所需的框

你是通过一些图像处理程序还是通过PIL获得RGB值的?可能是您加载了图像,PIL转换为web颜色,这将解释随机性(您的浅黄色值非常接近浅黄色web颜色)。为了更好地测量,请在加载后尝试转换图像:
tt.convert('RGB')
,并确保实际值在图像中。如果图像仅包含网络安全颜色,您将找不到绿色值。您是否从某些图像处理程序或通过PIL获得RGB值?可能是您加载了图像,PIL转换为web颜色,这将解释随机性(您的浅黄色值非常接近浅黄色web颜色)。为了更好地测量,请在加载后尝试转换图像:
tt.convert('RGB')
,并确保实际值在图像中。如果图像只包含网络安全颜色,你将无法找到你的绿色值。我同意你的事实,即在结束我已经到达我想要的盒子之前最好考虑更多的像素。1,我同意你的观点:在得出我已经达到我想要的盒子之前,最好多考虑一些像素。这绝对是个问题。我习惯于在Java中使用标签,现在开始学习Python,我经常会犯这些愚蠢的错误。感谢您理解此缺陷并提出更正建议。(+1表示创建单独函数的想法)。这肯定是问题所在。我习惯于在Java中使用标签,现在开始学习Python,我经常会犯这些愚蠢的错误。感谢您理解此缺陷并提出更正建议。(+1表示创建单独函数的想法)。