2016-08-05 2 views
0

현재 전체 이미지의 평균을 기준으로 임계 값보다 큰 픽셀 값의 총합을 검색하는 연습을하고 있습니다. (나는 Python을 처음 접한다.) 파이썬 3.5.2를 사용하고 있으며 위의 코드는 코드를 작성하고 실험하기 위해 사용하고있는 Atom 프로그램에서 복사 한 것입니다.파이썬에서 평균 기반 임계 값보다 높은 총 픽셀 값을 검색하는 방법

당분간 저는 빨간 채널로 연습하고 있습니다.하지만 결국 모든 색상 채널을 개별적으로 분석해야 할 것입니다. 내가 지금까지 사용하고

전체 코드 :

이제
import os 
from skimage import io 
from tkinter import * 
from tkinter.filedialog import askopenfilename 
def callback(): 
    M = askopenfilename()  #to select a file 
    image = io.imread(M)  #to read the selected file 
    red = image[:,:,0]   #selecting the red channel 
    red_av = red.mean()   #average pixel value of the red channel 
    threshold = red_av + 100 #setting the threshold value 
    red_val = red > threshold 
    red_sum = sum(red_val) 
    print(red_sum) 
Button(text = 'Select Image', command = callback).pack(fill = X) 
mainloop() 

, 모든 것이 지금까지 내가 프로그램을 실행하는 경우를 제외하고 작동이 red_sumthreshold 위의 픽셀 수가 아닌 나옵니다 총 픽셀.

내가 무엇이 누락 되었습니까? 나는 red_val 변수를 선언하는 나의 (가능한 순진) 방법이 그 변수와 관련이 있다고 생각하고있다.

하지만 임계 값보다 높은 총 픽셀 값을 검색하려면 어떻게해야합니까?

+0

왜 그런지는 모르겠지만 위와 같이 쓸 때 - 나는'red_sum'에 대한 값의 목록을 얻습니다. -하지만 (내가 바로 위에) 합계 줄을'red_sum = red_val.sum()'으로 바꾸면 얻을 수 있습니다. 수치적인 대답. –

답변

1

(red > threshold)을 만들었 으면 임계 값보다 높은 빨간색으로 표시된 모든 픽셀의 값은 1이고 그렇지 않은 경우 0이되는 마스크가 있습니다. 이제 값을 얻으려면 마스크에 빨간색 채널을 곱하면됩니다. 곱셈은 ​​임계 값보다 작은 모든 값을 0으로 만들고 임계 값을 초과하는 값은 변경하지 않습니다.

코드 : 어떤이가하는 것은, 마스킹에 대한 SciPy.org documentation에서

import numpy.ma as ma 
...  

red_val = ma.masked_outside(red, threshold, 255).sum() 

:

red_val = (red > threshold)*red 
red_sum = sum(red_val) 
+0

완벽! 당신의 설명도 완벽하게 이해됩니다 - 아주 잘 작동하는 아주 좋은 간단한 방법. –

0

내가 찾은 또 다른 방법은 그 (총 픽셀 값을 제공하는) 일이 마스크 값을 사용하는 것이 었습니다 :

주어진 간격 외의 배열을 마스크하십시오. 예에서

상기 threshold의 구간을 벗어난 (제 질문에 정의)와 255는 "마스크"되고, 화소 값의 합을 계산하는 기능을하지 않는다.

관련 문제