【问题标题】:How to select a specific color from an image using this command?如何使用此命令从图像中选择特定颜色?
【发布时间】:2014-03-14 00:18:10
【问题描述】:

我收到了一张图片,其中的单词已正确分割并以不同的颜色表示。

图片如下:

有人告诉我,即使没有源文件,我也可以从该图像中选择特定的文字/颜色并将其保存以供进一步处理。这可以通过创建一个新图像 v 来完成,这样

v=r+g*256+b*256*256+1

其中 r、g 和 b 分别是红色、蓝色和绿色通道。

我尝试使用它,但它创建的只是一个白色的空白图像

img = imread('color_test.bmp');
r = img(:,:,1);
g = img(:,:,2);
b = img(:,:,3);

v=r+g*256+b*256*256+1;

我不明白上面的 v 图像如何允许我选择单个颜色?

【问题讨论】:

    标签: image matlab image-processing image-segmentation


    【解决方案1】:

    用于创建矢量v 的转换只是为所有可能的 RGB 颜色值创建唯一数值的一种方式。要了解其工作原理,请想象一个简化的 RGB 系统,其中每种颜色的值限制在 0 到 9 之间。此外,我们通过将 255 替换为 10 来简化您的转换:

     v = r + g*10 + b*100
    

    现在很容易看出每个值
    (1) v 始终介于 0 和 999 之间 (2) 所有红色值都编码在一个
    (3) 所有绿色值都以十位编码
    (4) 并且所有蓝色值都以百位编码。

    因此,不同的颜色总是会在v 中产生不同的值。

    假设您的图像包含n 不同的颜色。那么您的矩阵v 将只包含n 唯一值(即,每种颜色一个),可以使用命令unique 来识别这些值

     colorValues = unique(v); 
    

    如果您现在想要识别图像中与特定颜色相对应的所有区域,例如向量中的第一个值colorValues,您可以简单地使用

    v == colorValues(1)
    

    这将在包含指定颜色的所有单元格中为您提供。

    如果你想根据颜色将你的图像分成几张图像,你可以使用

    newImg = zeros(size(img)); 
    newImg(repmat(v == colorValues(1), [1 1 3]) = 255; 
    

    现在newImg 应该只包含与colorValues(1) 中的颜色匹配的所有内容。

    要查找不同的颜色,只需使用不同的索引,例如

     newImg(repmat(v == colorValues(2), [1 1 3]) = 255
    

    【讨论】:

    • 谢谢,这正是我想做的。你能帮我理解生成v 的变换方程吗?这条简单的线条如何为每种颜色创造独特的价值?你也可以解释一下这一行:newImg(v == colorValues(1)) = colorValues(1);这里发生了什么?它确实通过给出不同的值来代替1 来生成所需的结果,但仅在 LHS 上。不管我给 RHS 什么样的价值,答案还是一样? newImg(v == colorValues(1)) = 255; 产生与上述等式相同的结果。
    • @FarazKhan:请看我修改后的答案。
    • 谢谢。那是完美的。我唯一不明白的是为什么,为什么所选单词的颜色是红色?我知道newImg 的背景是黑色的,因为newImg = zeros(size(img)); unique 找到的单词是用红色写的。在我们的代码中,我们在哪里告诉它是红色的?假设我想让它变白?我可以这样做吗?谢谢
    • @FarazKhan 我的代码有错误。作为副产品,复制的文本现在将是白色的。
    【解决方案2】:

    我可以从您的问题中收集到的是,您需要以某种方式存储有关单独颜色文本的“信息”。因此,下面的代码可能会解决它,为此我必须实际记下 6 种不同颜色文本中的每一种的颜色。生成的 4D 矩阵存储所有“信息”。请注意,当我们正在寻找完美匹配的颜色时,我们可以通过挤出存储冗余数据的第 3 个维度轻松地将其变为 3D。

    代码

    %// Read image
    img = imread('color_test.bmp');
    
    %%// Create a database of text colors
    color1 = [236 3 104]; %%// text1
    color2 = [57 228 2]; %%// text2
    color3 = [147 190 131]; %%// text3
    color4 = [5 107 106]; %%// text4
    color5 = [254 223 188]; %%// text5
    color6 = [19 98 13]; %%// text6
    color = [color1;color2;color3;color4;color5;color6]; %%// all text colors in a Nx3 matrix
    
    %%// Save all the individual colored images in a 4D matrix for later
    img_all = false([size(img) size(color,1)]);
    for k = 1:size(color,1)
        img_all(:,:,:,k) = bsxfun(@eq,img,permute(color(k,:),[1 3 2]));
    end
    
    %%// Show the images as black and white
    figure,
    for k = 1:size(color,1)
        subplot(size(color,1),1,k), imshow(uint8(255.*img_all(:,:,:,k)));
    end
    
    %%// Show the images in their original colors
    figure,
    for k = 1:size(color,1)
        subplot(size(color,1),1,k), imshow(uint8(bsxfun(@times,img_all(:,:,:,k),permute(color(k,:),[1 3 2]))));
    end
    

    输出

    让我们知道这是否适合您!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 2022-06-11
      • 2017-02-18
      • 2010-11-06
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多