【问题标题】:Change pixels of certain color of an RGB image into another color Matlab将RGB图像的某种颜色的像素更改为另一种颜色Matlab
【发布时间】:2025-07-22 07:10:01
【问题描述】:

我有一个 RGB 图像 20x100x3,我想将颜色为 17,167,243 的像素更改为这种颜色 108,5,15 。如果有人可以请告知如何在 Matlab 中完成此操作?

【问题讨论】:

    标签: image matlab image-processing


    【解决方案1】:

    假设img 作为输入图像数组,这可能是bsxfun 的一种方法-

    oldval = [17,167,243]
    newval = [108,5,15]
    
    idx = find(all(bsxfun(@eq,img,permute(oldval,[1 3 2])),3))
    idx_all = bsxfun(@plus,idx(:),[0:2]*numel(img(:,:,1)))
    img(idx_all) = repmat(newval,numel(idx),1)
    

    或者使用logical indexing 而不是之前使用的基于linear indexing 的方法稍作修改-

    mask = all(bsxfun(@eq,img,permute(oldval,[1 3 2])),3)
    img(repmat(mask,1,1,3)) = repmat(newval,sum(mask(:)),1)
    

    【讨论】:

    • 你能告诉我如何设置oldval吗?就像我的 oldval (R,G,B) 是 (17,167,243) 一样?
    • @shepherd 请查看编辑。我错过了之前设置的值。
    • 在逻辑索引解决方案中,它在 repmat 函数中给出了这个错误Too many input arguments.
    • @shepherd 你能找到它在抱怨哪个 repmat,因为那里有两个 repmat。另外您使用的是哪个 MATLAB 版本?
    • @shepherd 可以试试img(repmat(mask,1,1,3)),而不是img(repmat(mask,[1 1 3]))。我假设这是一个版本问题。
    【解决方案2】:

    不是最优雅的解决方案:找到矩阵image(:,:, 1) 的索引等于17(使用find()),然后image( :,:, 2) 相同等于167,然后(:, :, 3)...然后确定所有索引在所有三个列表中(使用ismember())。将(:, :, x) 矩阵中这些像素的值更改为各自请求的 RGB 值。

    【讨论】:

      最近更新 更多