Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Matlab:256个二进制矩阵到一个256级灰度图像_Matlab_Image Processing_Pixels_Grayscale - Fatal编程技术网

Matlab:256个二进制矩阵到一个256级灰度图像

Matlab:256个二进制矩阵到一个256级灰度图像,matlab,image-processing,pixels,grayscale,Matlab,Image Processing,Pixels,Grayscale,我的一个过程产生256个二进制(逻辑)矩阵,每个灰度级源图像对应一个 代码如下: so = imread('bio_sd.bmp'); co = rgb2gray(so); for l = 1:256 bw = (co == l); % Binary image from level l of original image be = ordfilt2(bw, 1, ones(3, 3)); % Convolution filter bl(int16(l

我的一个过程产生256个二进制(逻辑)矩阵,每个灰度级源图像对应一个

代码如下:

so = imread('bio_sd.bmp');
co = rgb2gray(so);

for l = 1:256
    bw = (co == l); %         Binary image from level l of original image
    be = ordfilt2(bw, 1, ones(3, 3)); %  Convolution filter
    bl(int16(l)) = {bwlabel(be, 8)}; %   Component labelling
end
我获得了一个包含256个二进制图像的单元数组。如果该位置的源图像像素与二值图像的索引具有相同的级别,则该二值图像包含1s

即,二进制图像bl{12}包含1s,其中源图像具有级别为12的像素

我想通过将256个二进制矩阵组合回灰度图像来创建新图像

但我对Matlab非常陌生,我想知道是否有人能帮我编写代码:)


ps:我使用的是matlab R2010a学生版。

最简单的解决方案是依次迭代每个逻辑矩阵,乘以相应的权重,然后累加到一个输出矩阵中,该矩阵将代表您的最终图像。

最简单的解决方案是依次迭代每个逻辑矩阵,将其乘以相应的权重,然后累加到一个输出矩阵中,该矩阵将代表您的最终图像。

整个答案仅适用于

假设您可以将所有的二进制矩阵合并成一个大的n×m×256矩阵
二进制图像(x,y,greyvalue)
。然后,您可以计算最终图像,如下所示:

newimage=sum(bsxfun(@times,binaryimage,reshape(0:255,1,1,[])),3)
这里的魔术是由bsxfun完成的,它将3D(nxmx256)二进制图像与包含灰色值0…255的1x1x256向量相乘。这将生成一个3D图像,其中对于固定的x和y,向量(y,x,:)包含许多零,并且(对于一个灰度值
G
,其中二进制图像包含
1
),它包含值
G
。所以现在你只需要在这个第三维度上求和就可以得到一个
nxm
图像

更新

要测试此功能是否正常工作,请先换一种方式:

fullimage=floor(rand(100,200)*256);
figure;imshow(fullimage,[0 255]);
是一个随机灰度图像。您可以这样计算256个二进制矩阵:

binaryimage=false([size(fullimage) 256]);
for i=1:size(fullimage,1)
   for j=1:size(fullimage,2)
      binaryimage(i,j,fullimage(i,j)+1)=true;
   end
end
我们现在可以应用我上面给出的解决方案

newimage=sum(bsxfun(@times,binaryimage,reshape(0:255,1,1,[])),3);
并验证我是否返回了原始图像:

all(newimage(:)==fullimage(:))
它给出了
1
(true):-)

更新2

您现在提到,您的二进制图像位于一个单元格数组中,我假设
binimg{1:256}
,每个单元格包含一个nxm二进制数组。如果可以的话,更改生成这些数据的代码来创建我上面使用的3D二进制数组可能是有意义的——如果不同的单元格包含不同类型、形状或大小的数据,则单元格最有用

如果有充分的理由坚持使用单元阵列,则可以使用将其转换为三维阵列

binaryimage = reshape(cell2mat(reshape(binimg,1,256)),n,m,256);
如上所述,使用
n
m
。如果已经有
大小(binimg)==[1 256]
,则不需要进行内部重塑。总之,您需要使用单元格数组
binimg
来计算3D矩阵二进制图像,然后您可以使用它来计算
newimage
,您有兴趣在我回答的最开始使用代码

希望这有帮助……

整个答案只适用于

假设您可以将所有的二进制矩阵合并成一个大的n×m×256矩阵
二进制图像(x,y,greyvalue)
。然后,您可以计算最终图像,如下所示:

newimage=sum(bsxfun(@times,binaryimage,reshape(0:255,1,1,[])),3)
这里的魔术是由bsxfun完成的,它将3D(nxmx256)二进制图像与包含灰色值0…255的1x1x256向量相乘。这将生成一个3D图像,其中对于固定的x和y,向量(y,x,:)包含许多零,并且(对于一个灰度值
G
,其中二进制图像包含
1
),它包含值
G
。所以现在你只需要在这个第三维度上求和就可以得到一个
nxm
图像

更新

要测试此功能是否正常工作,请先换一种方式:

fullimage=floor(rand(100,200)*256);
figure;imshow(fullimage,[0 255]);
是一个随机灰度图像。您可以这样计算256个二进制矩阵:

binaryimage=false([size(fullimage) 256]);
for i=1:size(fullimage,1)
   for j=1:size(fullimage,2)
      binaryimage(i,j,fullimage(i,j)+1)=true;
   end
end
我们现在可以应用我上面给出的解决方案

newimage=sum(bsxfun(@times,binaryimage,reshape(0:255,1,1,[])),3);
并验证我是否返回了原始图像:

all(newimage(:)==fullimage(:))
它给出了
1
(true):-)

更新2

您现在提到,您的二进制图像位于一个单元格数组中,我假设
binimg{1:256}
,每个单元格包含一个nxm二进制数组。如果可以的话,更改生成这些数据的代码来创建我上面使用的3D二进制数组可能是有意义的——如果不同的单元格包含不同类型、形状或大小的数据,则单元格最有用

如果有充分的理由坚持使用单元阵列,则可以使用将其转换为三维阵列

binaryimage = reshape(cell2mat(reshape(binimg,1,256)),n,m,256);
如上所述,使用
n
m
。如果已经有
大小(binimg)==[1 256]
,则不需要进行内部重塑。总之,您需要使用单元格数组
binimg
来计算3D矩阵二进制图像,然后您可以使用它来计算
newimage
,您有兴趣在我回答的最开始使用代码

希望这有助于……

您的代码的功能。。。 我认为最好先检查一下您发布的代码实际上在做什么,因为存在一些不一致之处。我将遍历循环中的每一行:

  • bw=(co==l)

    这只需创建一个二进制矩阵
    bw
    ,其中灰度图像
    co
    的像素强度等于循环值
    l
    。我注意到你从1循环到256,这让我觉得很奇怪。通常,将为,这意味着灰度值的范围将为0到255。在这种情况下,当
    l=256
    时计算的最后一个二进制矩阵
    bw
    将始终包含所有零。此外,您不会对灰度级别为0的像素进行任何处理。从随后的处理中,我猜您有意忽略0的灰度值,在这种情况下,您可能只需要从1循环到2