Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在图像的所有3通道中查找具有特定值的像素_Python_Image Segmentation - Fatal编程技术网

Python 在图像的所有3通道中查找具有特定值的像素

Python 在图像的所有3通道中查找具有特定值的像素,python,image-segmentation,Python,Image Segmentation,我有3个频道的图像。我有3个通道的像素值,如果一个像素在其3个通道中有这3个值,那么它属于“a”类。 比如说 classes\u channel=np.zero((image.shape[0],image.shape[1],num\u类)) pixel_class_dict={'0':[128,64,128],'1':[230,50,140]}num_class=2 对于范围内的通道(num_类): 像素值=像素等级[str(通道)] 对于范围内的i(image.shape[0]): 对于范围内

我有3个频道的图像。我有3个通道的像素值,如果一个像素在其3个通道中有这3个值,那么它属于“a”类。 比如说

classes\u channel=np.zero((image.shape[0],image.shape[1],num\u类))
pixel_class_dict={'0':[128,64,128],'1':[230,50,140]}num_class=2
对于范围内的通道(num_类):
像素值=像素等级[str(通道)]
对于范围内的i(image.shape[0]):
对于范围内的j(image.shape[1]):
如果列表(图像[i][j])==像素值:
类_通道[i,j,通道]=1
基本上,我想生成一个通道数组,它的数量等于类的数量,每个类在一个特定的通道中是分开的。
有什么有效的方法可以做到这一点吗

您可以使用numpy的广播更有效地检查频道中的任何值是否与另一个值匹配:

a=np.arange(2*3)。重塑(2,3) >>>a 数组([[0,1,2], [3, 4, 5]]) >>>a==4 数组([[False,False,False], [假,真,假]] 这样您就可以创建二进制掩码。以及那些可以与布尔运算符组合的运算符,如
np.logical\u和
np.logical\u或

>b=a==4
>>>c=a=0
>>>np.logical_和(b,c)
数组([[False,False,False],
[假,假,假]]
>>>np.logical_或(b,c)
数组([[True,False,False],
[假,真,假]]
在您的情况下,您可以在像素值的类别上循环,并比较不同的通道:

像素类dict={1:[18,19,20],2:[9,10,11]} >>>a=np.arange(2*4*3)。重塑(2,4,3) >>>b=np.zero((a.shape[:2]),dtype=np.int) >>>对于pixel_class,pixel_class_dict.items()中的pixel_值: ... 掩码=np.逻辑_和(*(a[…,通道]==像素_值[通道] …用于范围内的通道(a.形状[-1])) ... b+=像素_类*遮罩 ... >>>b 数组([[0,0,0,2], [0, 0, 1, 0]])
最后一部分之所以有效,是因为您可以将一个数字与一个布尔值相乘(
4*True==4
3*False==0
),还因为我假设字典中的每个像素值都是唯一的。如果后者不成立,您将对类标识符求和

稍微短一点的方法是重塑起始阵列:

>b=np.zero((a.shape[:2]),dtype=np.int)
>>>a2=a.重塑(-1,3)
>>>对于pixel_class,pixel_class_dict.items()中的pixel_值:
…掩码=(np.all(a2==像素值,轴=1)
…重塑(b.形状)
…b+=遮罩*像素_类
...
>>>b
数组([[0,0,0,4],
[0, 0, 2, 0]])
找到了另一个解决方案: 这里的图像是我们想要访问的图像(有3个通道)

将numpy导入为np
进口cv2
对于像素等级dict中的等级id:
class\u color=np.array(像素\u class\u dict[class\u id])
class_channel[:,:,int(class_id)]=cv2.inRange(图像,class_颜色,class_颜色)。astype('bool')。astype('float32'))

此答案缺少详细信息。首先,您使用的是类引用(
self
)。其次,
mask
未定义。第三,它生成语法错误。答案的意图(使用
cv2.inRange
)可能是好的,但是你应该改进它,让它被其他人使用。谢谢奥利弗指出。我已经做了所有的更正。cv2.inRange的使用真的加快了。