2

我在 matlab 中有一个具有 3 种颜色的图像,其值为0128255。例如:

255  255  255   255  128  255   0   255  255  128   0   255
255   0   255   255  128  255  255   0   255  128  255  255
255   0   255    0   128  255  255  255  255  128  255   0     
255  255   0    255  128  255  255   0   255  128  255  255
255   0    0    255  128   0   255  255   0   128  255   0     

首先,我想检查索引的像素(1,1)(1,5).

如果有像素值0(黑色),则索引(1,1)到的像素(1,5)变为128(灰色),如果没有,则将像素变为0(白色)。

其次,我想再次执行这些步骤,检查索引(2,1)(2,5)(3,1)(3,5),到底部,然后继续下一个,到索引(1,6)(1,10)(2,6)(2,10),到底部,然后到索引(1,11)(1,end)(2,11)(2,end)

4

2 回答 2

3

您绝对需要按顺序执行此操作吗?听起来您需要为每组表单 (n, (5*m : 5*m +1)) 执行此操作。如果是这样,您可以通过将矩阵重塑为 5 个元素宽的块的 3d 矩阵来同时进行所有测试。另外我假设您的意思是“如果没有,则像素更改为255(白色)”,而不是0.

假设您的图像被称为myImage,那么

numBlocks = numel(myImage)/(5*size(myImage,1));
% Generate a 3D matrix each of which is 5 elements long in dimension 2. Note reshape will throw an error if numblocks is fractional
foo = reshape(myImage,size(myImage,1),5,numBlocks); 
blackTest = any(foo==0,2);
result = blackTest * 128 + ~blackTest*255; % result for each block
output = reshape(repmat(result,[1 5 1]),size(myImage));

这会将您的图像重新组织成一个 3d 矩阵,其中与 3d 矩阵的每个“层”对应的每个子矩阵都是 5 个元素宽。对于整个 3d 矩阵,它检查第 2 维中的任何元素是否为零,在第 2 维中留下foo长度为 1的逻辑矩阵。foo由逻辑 1 和 0 组成,在 MATLAB 中也可以将其视为数字 1 和 0。所以它乘以foo128(对于灰度输出值)并加上foo乘以 255 的逻辑逆,得到你的白色输出值。最后,它将矩阵重复回 5 元素宽的块并将其恢复到其原始尺寸。

编辑:请注意,如代码注释中所述,如果您的原始图像不是 5 像素宽的倍数,则此代码将不起作用。要解决此问题,您必须创建一个特殊情况,或使用循环来逐步遍历每个 5 元素宽的块。事实上,这可能是一个更好的方法:

index = 1;
output = zeros(size(myImage));

while index < size(myImage,2)
blockEnd = min(index+4,size(myImage,2));
blackTest = any(myImage(:,index:blockEnd)==0,2);
blackTest = blackTest(:,ones(1,5));
output(1:end,index:blockEnd) = blackTest * 128 + ~blackTest*255;
index = index+5;
end
于 2012-04-15T14:47:23.777 回答
1
% generate matrix
rand_data = randi(10,10);
I = zeros(10);
I(rand_data < 6 & rand_data > 3) = 128;
I(rand_data >= 6) = 255;

% here's the code
I = reshape(I',5,[])';
mask = repmat(any(I == 0,2),5,1);
I(mask) = 128;
I(~mask) = 255;
I = reshape(I',10,[])';
于 2012-04-15T15:06:15.847 回答