如何在Python中检索高于基于平均值的阈值的总像素值

时间:2016-08-05 12:49:53

标签: python python-3.x image-processing pixels threshold

目前,我正在练习基于整个图像的平均值检索高于阈值的像素值的总和。 (我对Python很新)。我正在使用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_sum出现的是threshold上方的像素数,而不是像素的总数。

我错过了什么?我认为我(可能是天真的)声明red_val变量的方式与它有关。

但是,如何检索高于阈值的总像素值?

2 个答案:

答案 0 :(得分:1)

当您(red > threshold)时,您获得了一个掩码,使得所有红色高于阈值的像素都获得值10。现在要获取值,您可以将掩码与红色通道相乘。乘法将使所有小于阈值的值归零,并使值超过阈值不变。

代码:

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

答案 1 :(得分:0)

我发现另一种方法(提供总像素值)是使用屏蔽值:

import numpy.ma as ma
...    

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

SciPy.org documentation关于掩蔽,它的作用是:

  

在给定间隔之外屏蔽数组。

在该示例中,threshold(在我的问题中定义)和255的间隔之外的任何内容都被“屏蔽”,并且在计算像素值的总和时不具有特征。