Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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 图像像素上的matplotlib标记/遮罩_Python_Matplotlib - Fatal编程技术网

Python 图像像素上的matplotlib标记/遮罩

Python 图像像素上的matplotlib标记/遮罩,python,matplotlib,Python,Matplotlib,所以我有一个图像,我有一个用于该图像的像素掩码,其中掩码与图像大小相同,包含0和1的值,如果它是0,我不想修改图像,如果它是1,我想在图像的该像素上添加一个透明颜色 基本上,我想突出显示图像的某些部分,但仍然可以看到下面的内容 现在我到处寻找,但还没有找到一个简单的方法来做到这一点。我使用了np.where和mask来获得1的像素位置,以用于绘图函数。我第一次尝试使用小标记大小和无边缘颜色的散点图(),但是标记的大小不是一个图像像素,它们似乎是绝对大小,因此根据图形的大小,透明度会受到影响,并从

所以我有一个图像,我有一个用于该图像的像素掩码,其中掩码与图像大小相同,包含0和1的值,如果它是0,我不想修改图像,如果它是1,我想在图像的该像素上添加一个透明颜色

基本上,我想突出显示图像的某些部分,但仍然可以看到下面的内容

现在我到处寻找,但还没有找到一个简单的方法来做到这一点。我使用了np.where和mask来获得1的像素位置,以用于绘图函数。我第一次尝试使用小标记大小和无边缘颜色的散点图(),但是标记的大小不是一个图像像素,它们似乎是绝对大小,因此根据图形的大小,透明度会受到影响,并从重叠标记创建奇怪的图案

只是常规的pyplot函数创建了我想要的精确外观(其中的颜色平滑且不随图形大小变化),但它也为遮罩中不相交的线段之间的水平连接着色(因为我猜它是在绘制直线),所以我无法使用它

最有效的是补丁,我在这个问题中遇到了:()。我发现宽度和高度为1的矩形贴片给了我想要的效果,我可以在图像的某些像素上涂上透明的颜色。然而,这被证明为某些图像生成了一吨(数万)的矩形,因此速度相当慢。即使每次使用PatchCollection而不是调用addPatch时,速度仍然很慢

现在我可能只需要连接相邻的矩形来减少需要绘制的东西的数量,但我只是想知道是否有一种更简单的方法来做到这一点


谢谢。

您可以使用遮罩阵列或通过在RGBA图像中设置alpha值来进行半透明覆盖。这里两个都是经过处理的(使用三个半透明的红色正方形放置在圆形图案上的示例),它们给出了类似的图像(因此我只展示一个):

我认为这两种方法可以在所有情况下产生相同的结果,但是:
1。如果遮罩或构图变得复杂,遮罩阵列可以是一种更直接的方法,并且遮罩为您绘制覆盖图像提供了更大的灵活性,例如,您可以使用彩色贴图,而不是为每个像素指定完整的RGBA,但是,
2.掩蔽阵列方法不像RGBA那样对alpha值进行完全逐像素控制

z1 = sin(X*Y)
z1 = cos(2*X)
z2 = cos(5*(X+Y))

zm = ma.masked_where( (z2<.5) & (Y>0), z1)

figure()
imshow(z3)
imshow(zm, cmap=cm.gray, alpha=.4, vmin=-2, vmax=2)
show()

z1=sin(X*Y)
z1=cos(2*X)
z2=cos(5*(X+Y))
zm=ma屏蔽,其中((z20),z1)
图(
imshow(z3)
imshow(zm,cmap=cm.gray,alpha=0.4,vmin=-2,vmax=2)
show()

这有点疯狂,但事情是这样的:主图像是一个从蓝色到红色的圆形图案(
z3
)。然后,有一些垂直的条带会略微遮住这一点(
z1
),但只在图形的一半,而在另一半(由于遮罩的缘故)上会出现狭窄的交替对角线带。这里有一个使用遮罩数组的更复杂的图像:

只是为了补充tom10发布的内容,遮罩数组在彩色贴图中非常有效,但同时我还编写了一个小函数,可以用于任何RGB颜色元组

def overlayImage(im, mask, col, alpha):
    maskRGB = np.tile(mask[..., np.newaxis], 3)
    untocuhed = (maskRGB == False) * im
    overlayComponent = alpha * np.array(col) * maskRGB
    origImageComponent = (1 - alpha) * maskRGB * im
    return untocuhed + overlayComponent + origImageComponent
im是rgb图像

掩码是图像的布尔掩码,因此mask.shape+(3,)=im.shape

col只是要用以遮罩图像的三元组rgb值


alpha只是遮罩的alpha值/透明度

我还需要在我的区域上有一个清晰的轮廓。因此,您可以轻松地在顶部添加等高线图:例如,创建一个虚拟numpy数组,并在每个感兴趣的区域中设置不同的值。 下面是一个基于的答案构建的示例,条件不同:

x = y = linspace(-6, 6, 100)
X, Y = meshgrid(x, y)

z3 = X*X + Y*Y  # circular pattern

# first, do this with a masked array
figure()
imshow(z3, cmap=cm.jet, extent = (-6,6,-6,6));
zm = ma.masked_where((z3>=0.7) & (z3<=1.5), ones(np.shape(z3)));
imshow(zm, cmap=cm.bwr, alpha=.4, vmin=0, vmax=1, extent = (-6,6,-6,6)) #cm.bwr is an easy way to get red
# Build dummy array of 1s and 0s (you can play with different values to obtain different contours for different regions):
temp_vector = ones(np.shape(z3));
temp_vector[(z3>=0.7) & (z3<=1.5)] = 0.0;
temp_vector[(z3>8.2)] = 2.0; # etc.
# Create contour. I found only one contour necessary:
contour(X, Y, temp_vector, 1, colors=['r','g']);


show()
x=y=linspace(-6100)
十、 Y=网格网格(X,Y)
z3=X*X+Y*Y#圆形图案
#首先,使用蒙版数组执行此操作
图(
imshow(z3,cmap=cm.jet,范围=(-6,6,-6,6));
zm=ma.masked_,其中((z3>=0.7)&(z3=0.7)&(z38.2)]=2.0;#等。
#创建轮廓。我发现只需要一个轮廓:
轮廓(X,Y,温度向量,1,颜色=['r','g']);
show()
这将产生:

对不起,我对如何使用这个有点困惑。因此,如果我有一个800x800背景图像,我有一个包含3个20x20平方的1的遮罩,其他所有东西都是0,我将如何使用它将这3个平方打印为图像上的半透明红色框?
x = y = linspace(-6, 6, 100)
X, Y = meshgrid(x, y)

z3 = X*X + Y*Y  # circular pattern

# first, do this with a masked array
figure()
imshow(z3, cmap=cm.jet, extent = (-6,6,-6,6));
zm = ma.masked_where((z3>=0.7) & (z3<=1.5), ones(np.shape(z3)));
imshow(zm, cmap=cm.bwr, alpha=.4, vmin=0, vmax=1, extent = (-6,6,-6,6)) #cm.bwr is an easy way to get red
# Build dummy array of 1s and 0s (you can play with different values to obtain different contours for different regions):
temp_vector = ones(np.shape(z3));
temp_vector[(z3>=0.7) & (z3<=1.5)] = 0.0;
temp_vector[(z3>8.2)] = 2.0; # etc.
# Create contour. I found only one contour necessary:
contour(X, Y, temp_vector, 1, colors=['r','g']);


show()