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