簡體   English   中英

用於循環跳過圖像中的像素

[英]for loop skipping pixels in Image

我正在使用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]

為什么會這樣呢? 我是不是圖像迭代錯誤,還是以某種方式隨機化了 我應該進行哪些更改以獲得所需的輸出?

您只打破了內部循環,而是繼續搜索列。 最好編寫一個函數並直接返回結果:

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並沒有隨機化您的坐標。

顏色在黑色數字周圍像素化。 如果打印出來的像素的左邊和右邊的顏色start ,你會看到,他們是(251, 254, 207)(255, 255, 201) 以600倍或以上的比例放大圖像,您會看到淡紫色和藍色框中的數字周圍有淡黃色像素。

您可能需要搜索相同顏色的較大區域,例如一行5像素,然后確定顏色表示所需的框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM