我在matlab中有3种颜色的图像,其值为0
,128
和255
。例如:
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)
。
答案 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的逻辑矩阵foo
。foo
由逻辑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,[])';