【问题标题】:Checking Pixels in Matlab在 Matlab 中检查像素
【发布时间】:2014-02-27 22:46:29
【问题描述】:

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您绝对需要按顺序执行此操作吗?听起来您需要为每组表单 (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
    

    【讨论】:

    • 我没有足够的代表来评论权限,所以我会在这里提到 zenpoy 的答案与我上面的第一个解决方案相似但更优雅。据我所知,它也受到同样的 5 倍数限制。
    • 感谢您的帮助。我发现这种情况的方法不是 5 像素宽的倍数。我将列添加为 5 的倍数,那么最终结果我只取了矩阵的开头。
    • 是的,这可行,但您需要确保添加的列不包含零,否则您的结果会出现偏差。
    【解决方案2】:
    % 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-05-09
    • 2012-04-27
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多