2017-10-27 6 views
0

각 열의 y 값을 통해 각 픽셀의 RBG 값을 반환 할 수 있도록 코드를 작성했습니다. 내 이미지에서 순수한 흰색으로 채워진 픽셀을 모두 찾으려고합니다. 그러나 어떤 이유에서 나는 첫 번째 열의 최종 값을 찾았을 때 "IndexError : 이미지 인덱스가 범위를 벗어났습니다."라는 오류 메시지가 나타납니다. 어떻게하면 다음 열로 이동할 수 있습니까?python 픽셀 단위로 이미지를 분석하는 방법

내 코드는 다음과 같습니다

from PIL import Image 

pix = newimage2.load() 
print(newimage2.size) 
print(" ") 

whitevalues = 0 
x = 0 
while x <= newimage2.width: 
    y = 0 
    while y <= newimage2.height: 
     print(pix[x,y]) 
     if pix[x,y] == (255,255,255): 
      whitevalues = whitevalues + 1 
     y = y+1 
    x = x+1 
print(whitevalues) 

답변

0

당신은 단지 두 동안 루프에서 '<'에 '= <'을 변경해야합니다.

주된 이유는 색인이 0부터 시작한다는 것입니다. 따라서 이미지 크기를 보면 (100,100)이지만 픽셀 pix [100,100]에 액세스하려고하면 존재하지 않습니다.

그러나 pix [99,99]가 존재하며 pix [100,100]에 해당합니다.

건배 제로 인덱싱

0

마지막 인덱스 크기보다 하나 적다. 따라서 <=<으로 변경해야합니다. 또한이 질문에는 index 태그가 있어야합니다.

기본 제공 함수를 사용하여이 작업을 수행 할 수있는 여러 가지 방법이 있습니다. 예제는이 질문을 참조하십시오. How to count the occurrence of certain item in an ndarray in Python?. 이러한 솔루션은 상당히 빠를 가능성이 큽니다.

0

대신 while 루프의 다음 코드를 시도 :

[width, height] = newimage2.size 
for x in range(width): 
    for y in range(height): 
     cpixel = pixels[x, y] 
     if(cpixel ==(255,255,255): 
      whitevalues = whitevalues + 1 

이 인덱스가 범위에 있는지 확인합니다.

0

파이썬은 당신이 즉 경우, zero-indexedlist 같은 :

l = [1, 4, 7, 3, 6] 

그리고 당신은 while loop (A for-loop이 마음을 더 잘 할 수 없지만 않을 것), 당신은해야 할 것입니다 그것을 통해 iterate 원하는 indexloopwhilelistlength보다 작 - 그래서 index 실제로 O를 length 결코 f list, 전에 최대 1까지.

과 같이 보일 것이다 위의 list 이상 iterating의 코드 : 당신의 output을 줄 것이다

i = 0 
while i < len(l): 
    print(l[i]) 
    i += 1 

을 :

1 
4 
7 
3 
6 

동일한 논리가 적용되는 당신의 image - 결국 결국은 2-dimensionallist입니다.

코드의 less than or equal (<=) 비교기를 less thans (<)으로 수정해야한다는 의미입니다. 그런 다음 코드가 원하는 방식으로 작동해야합니다. 내가 처음에 언급 한 바와 같이 더 파이썬을 덜 라인을 필요로하고있다되므로

from PIL import Image 
pix = newimage2.load() 
print(newimage2.size) 
print(" ") 
whitevalues = 0 
x = 0 
while x < newimage2.width: 
    y = 0 
    while y < newimage2.height: 
     print(pix[x,y]) 
     if pix[x,y] == (255,255,255): 
      whitevalues += 1 
     y += 1 
    x += 1 

print(whitevalues) 

그러나,하는 for-loop이 응용 프로그램에 대한 더 나은 것 :

그래서이 코드가 수정 될 것입니다. 그래서 여기가 유용하게 사용할 수있는 for-loop에 대한 코드는 다음과 같습니다

from PIL import Image 
pix = newimage2.load() 
print(newimage2.size) 
print(" ") 
whitevalues = 0 
for row in newimage2 
    for col in row: 
     print(col) 
     if col == (255,255,255): 
      whitevalues += 1 

print(whitevalues) 

당신이 매우 파이썬으로 원하는 경우 또는, 당신은 list-comprehension에서이 작업을 수행 할 수 있습니다 :

whitevalues = sum([1 for r in pix for c in r if c == 1]) 
0

다른 해결책은 코드가 작동하지 않는 이유입니다. 따라서 흰색 픽셀을 세는 또 다른 방법을 보여 주기만하면됩니다.

from PIL import Image 

image_path = '/path/to/image' 
image = Image.open(image_path) 
count = 0 

# image.getdata() returns all the pixels in the image 
for pixel in image.getdata(): 
    if pixel == (255, 255, 255): 
     count += 1 

print(count)