在Matlab中检查像素

时间:2012-04-15 14:19:21

标签: matlab

我在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)

2 个答案:

答案 0 :(得分: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中留下长度为1的逻辑矩阵foofoo由逻辑1和0组成,在MATLAB中可以也被视为数字和零。因此,它将foo乘以128(灰度输出值),并将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

答案 1 :(得分: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,[])';