代码之家  ›  专栏  ›  技术社区  ›  Suhail Gupta

为什么应用同一个通道三次会产生黑白图像?

  •  0
  • Suhail Gupta  · 技术社区  · 6 年前

    我在用opencv进行颜色交换的实验。在下面的片段中,结果非常接近我的预期。

    import cv2
    
    color = cv2.imread("lohri.jpg")
    b,g,r = cv2.split(color)
    swap = cv2.imwrite("swap.jpg", cv2.merge((r,g,b)))
    

    如上所示,我已经交换了红色和蓝色两个颜色通道。但如果我只应用一个通道,如下所示:

    swap = cv2.imwrite("swap.jpg", cv2.merge((b,b,b)))
    

    下面是应用同一频道三次后得到的图像。

    enter image description here

    原始图像看起来像: enter image description here

    这与频道(r,g,b)的选择无关

    1 回复  |  直到 6 年前
        1
  •  0
  •   Paritosh Singh    6 年前

    这里有几件事需要理解。

    弗斯特 Source article. Highly recommend reading it

    数码照片由像素组成,像素是彩色点, 图像中最小的元素。 颜色。

    大胆强调我的。

    第二 ,

    存在多种颜色编码方式。其中最突出的是 RGB公司。我们到了:RGB。代表:红色。G的意思是:绿色。B是指: 成份:红、绿、蓝。信不信由你, 所有颜色 那个 人类可以看到 蓝色。

    第三 ,在RGB中,数字表示该颜色/通道的“数量” 成分 . 0意味着:没有,255意味着:最大的数量。

    第四

    第一个观察:在颜色编码的RGB方式中,越高的 数字,对应的颜色越浅。

    第二个观察: 中性色:白色、灰色或黑色。

    这部分真的很重要。因为R、G和B值只代表组件,所以必须根据每个组件的“多少”来合并它们。如果它们以相同的数量出现,它们都会产生从黑到白(通常称为灰度)的阴影。黑度/白度取决于每个频道的实际数量,0表示黑色,255表示白色,其他介于两者之间。理解这一点很重要,这意味着图像仍然可以有3r、G、B分量,但是对于灰度级的像素,它们都被设置为相同的值。

    现在,深入到它的编码方面,重要的是要意识到,数字就是纯数字。

    import cv2
    
    color = cv2.imread("lohri.jpg")
    b,g,r = cv2.split(color)
    

    这里,b,g和r是 ,它们只是存储数字的矩阵,每个像素一个。我可以为他们写下不同的名字,如下所示:

    import cv2
    
    color = cv2.imread("lohri.jpg")
    apple,mango,orange = cv2.split(color) #perfectly valid, although confusing
    

    swap = cv2.imwrite("swap.jpg", cv2.merge((b,b,b)))
    

    swap = cv2.imwrite("swap.jpg", cv2.merge((some_random_matrix,some_random_matrix,some_random_matrix)))
    

    或者像这样,

    swap = cv2.imwrite("swap.jpg", cv2.merge((apple,apple,apple)))
    

    b 就其本身而言 只是一个数字矩阵 . 当您使用merge函数并将每个R、G和B通道设置为 同一矩阵 ,有效地为每个像素为每个R、G、B值分配相同的值。如我们之前所知,当像素的每个“通道”具有相同的值时,“组合”总是从黑到白(或灰度)。

    blue 你现在可以猜出正确的方法,而不是灰度。

    正确的方法是将值保留在蓝色通道中,但将每个像素的其他通道设置为0。将所有频道设置为相同的值并不能使您获得“更多的特定颜色”,因为单独的值没有意义,它只是每个频道上的值的“组合”。

    color = cv2.imread('lohri.jpg')
    
    new_image = color.copy()
    # set green and red channels to 0
    new_image[:, :, 1] = 0
    new_image[:, :, 2] = 0
    cv2.imwrite("only_blue.jpg", new_image)