0

필로와 함께 Python 3.3을 사용하고 있고, 각각의 이미지에 대해 모든 픽셀 색상을 분석하고 각 색상이 흰색 또는 검정에 가장 가까운 지 계산하려고합니다. 이 수식을 사용하여 유클리드 거리로 시도했습니다.목록의 각 항목에 대한 유클리드 거리를 계산합니다.

>>>a,b=(127,255) #color value of pixel at position (1,1) 
>>>whitedist=sqrt((a-255)**2 + (b-255)**2) 
>>>print (whitedist) 
128.0 

픽셀은 그레이 스케일 이미지로 작업하기 때문에 두 값을 갖습니다. 것은 물론 나는 128 * 128 영상의 각 픽셀에 대해이 작업을 수행 할 수없는, 그래서 내가주기 "를"내 첫 번째를 작성하는 시도 : 이것은 완전히 바보 같은 시도였다

colors=im.getdata() #all pixel values 
for item in col: 
    for item in range (0, 127): 
    print ("B") #if the value is between 0 and 127 the color is nearer to black 

, 파이썬은 갔다 무한 루프에 들어가서 그만 두어야했습니다. 내 문제는 내가해야할 일에 대한 원시 아이디어가 있지만, 파이썬을 너무 잘 사용하여 내 추론을 코드로 변환 할 수 없다는 것이다. 내 추론은 완전히 틀린 것은 아니지만 코드로 변환 할 방법을 찾을 수는 없다고 생각합니다.

list (im.getdata())는 두 개의 값을 포함하는 각 픽셀에 대해 하나의 튜플을 반환하기 때문에 각 튜플에 수식 whitedist=sqrt((a-255)**2 + (b-255)**2)을 적용하고 수식의 결과 < 128이면 픽셀을 "dark"로 태그 지정하고, 128보다 크면 픽셀을 "light"로 태그 지정합니다. 그런 다음 모든 어둡고 밝은 픽셀을 세고 이미지에 어둡거나 밝은 픽셀이 있는지 확인해야합니다.

주기를 사용하면이 작업을 수행하는 것이 완전히 잘못 되었습니까?

+0

_ "그레이 스케일 이미지로 작업하기 때문에 픽셀 값이 두 개 있습니다."_ 정말로 틀니? 나는 그레이 스케일 이미지가 두 개가 아니라 하나의 채널만을 가지고 있다고 생각했다. 3 개의 채널 이미지는 적색, 녹색 및 청색의 강도 각각에 대해 하나의 수를 갖는다. 하나의 채널 이미지는 밝기에 대해 하나의 번호를가집니다. 두 숫자는 무엇을 나타낼까요? – Kevin

+0

이전에 변환했기 때문에 회색 음영이라고 확신하지만 두 숫자가 나타내는 내용이 확실하지 않습니다. 각 픽셀에는 두 개의 숫자가 있지만 두 번째 숫자는 항상 255이므로 첫 번째 것은 밝기이어야합니다. – Mikhaylova

+0

첫 번째 숫자는 밝기이고 두 번째 숫자는 투명도입니다. 그렇다면 255는이 문맥에서 단지 "불투명"을 의미 할뿐입니다. – Kevin

답변

1

이 시도 : 모든 픽셀을 검색 GetData의와

colors = im.getdata() #all pixel values 
# initialize lists for dark and light pixels 
darkList=[] 
lightList=[] 
# set counter for dark and light pixels 
dark = 0 
light = 0 
for item in colors: # iterate over each tuple 
    if sqrt((item[0]-255)**2 + (item[1]-255)**2) < 128: # See if Euclidean distance is less than 128 
     lightList.append(item) # append pixel to light pixel list 
     light+=1 # increment light pixel counter 
    else: 
     darkList.append(item) # append pixel to dark pixel list 
     dark+=1 # increment dark pixel counter 

print("Total light pixels =",light) 
print(lightList) 
print("Total dark pixels =",dark) 
print(darkList) 
+0

감사합니다. 작동합니다! RGB 값을 사용하고 싶다면 수식을 sqrt (항목 [0] -255) ** 2 + (항목 [1] -255) ** 2 + (항목 [3] -255) ** 2), 맞죠? – Mikhaylova

+0

맞지만 RGB 값의 경우'im.getdata()'는 길이가 3 인 튜플을 반환합니다. –

2

을, 이미지 크기가이 16384 개 픽셀을 의미 128 X 128입니다 그래서 만약. 당신이 언급 한 것처럼 이들은 변수 색상에 16384 값으로 저장됩니다.

당신은 하나 개의 루프 전체 값을 통해 단지 루프 할 수 있습니다

for item in colors: 
    whitedist=sqrt((item[0]-255)**2 + (item[1]-255)**2) 
    if whitedist <= 128: 
    darkPixels++ 
    else: 
    lightPixels++ 

당신이 색상은 당신이 언급 한대로 유클리드 거리를 계산할 수 있습니다 표현하는 방법을 알고 있다면

. 값이 128 일 경우 수행 할 작업과 태그를 저장하는 방법을 지정하지 않았습니다. 얼마나 많은 픽셀이 어둡거나 밝은 지 알아야하는 경우 위의 예제를 사용할 수 있습니다.

+0

감사합니다. @ Maverick2k. 나는 내가 지금 가치 128을 무시할 것이라고 생각한다. 또는 아마도 그것을 "중립적"이라고 태깅하는 것에 대해 생각할 수있다. – Mikhaylova

관련 문제