目前,我正在练习基于整个图像的平均值检索高于阈值的像素值的总和。 (我对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
变量的方式与它有关。
但是,如何检索高于阈值的总像素值?
答案 0 :(得分:1)
当您(red > threshold)
时,您获得了一个掩码,使得所有红色高于阈值的像素都获得值1
和0
。现在要获取值,您可以将掩码与红色通道相乘。乘法将使所有小于阈值的值归零,并使值超过阈值不变。
代码:
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
的间隔之外的任何内容都被“屏蔽”,并且在计算像素值的总和时不具有特征。