matlab - 在 Matlab 中检查像素

标签 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)

最佳答案

您绝对需要按顺序执行此操作吗?听起来您需要对 (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 的逻辑矩阵 foofoo 由逻辑 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/

相关文章:

MATLAB:使用 writeVideo 制作视频

python - 在python中打开二进制数据

Matlab - 通过具有特定值来过滤矩阵

java - 使matlab代码与android兼容

matlab - 如何在 MATLAB 中创建 FFT 图?

matlab - (0.3)^3 == (0.3)*(0.3)*(0.3) 在 matlab 中返回 false?

c++ - 选择默认的 gcc/g++ 编译器

c - 如何在 Matlab Coder 中为具有不同输入数量的函数定义输入类型?

c++ - 在 Visual Studio 中构建 MATLAB mex 文件给出 "LNK2019 unresolved external symbol _mexPrintf referenced in function mexFunction"?

matlab - 为什么对 Matlab DLL 的第一次调用比后续调用花费的时间长得多?