我在 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)
。
最佳答案
您绝对需要按顺序执行此操作吗?听起来您需要对 (n, (5*m : 5*m +1)) 形式的每个组执行此操作。如果是这样,您可以通过将矩阵 reshape 为 5 个元素宽的 3d block 矩阵来同时执行所有测试。另外,我假设您的意思是“如果没有,则像素将更改为 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 和零,在 MATLAB 中也可以被视为数字一和零。因此,它将 foo
乘以 128(对于灰色输出值),并添加 foo
的逻辑逆乘以 255,以获得白色输出值。最后,它将矩阵重复回 5 个元素宽的 block ,并将其恢复到其原始尺寸。
编辑:请注意,如代码注释中所述,如果原始图像不是 5 像素宽的倍数,则此代码将不起作用。要解决此问题,您必须创建一个特殊情况,或者使用循环来逐步执行每个 5 元素宽的 block 。事实上,这可能是一个更好的方法:
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
关于matlab - 在 Matlab 中检查像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10162805/