精华内容
下载资源
问答
  • 我们起来学习彩色图像的颜色通道分离与多通道图像混合,一般情况下,我们大多数看到的图像都是基于RGB颜色通道的图像,因此要实现颜色通道的分离,即要将R、G、B三个通道分离,而多通道图像混合,即将R、G、B三个...

    今天呢,我们一起来学习彩色图像的颜色通道分离与多通道图像混合,一般情况下,我们大多数看到的图像都是基于RGB颜色通道的图像,因此要实现颜色通道的分离,即要将R、G、B三个通道分离,而多通道图像混合,即将R、G、B三个通道的图像进行混合起来,重新组成一幅彩色图像。

    实现的话,我们可以通过OpenCV的split函数与merge函数可以很方便的达到目的。

    接下来我们正式进入颜色通道分离与多通道图像混合的内容

    一、颜色通道的分离与合并

    1、split()函数

    功能:将一个多通道的数组分离成几个单通道的数组。

    函数原型:

    void split(const Mat& src, Mat*mvbegin);
    void split(InputArray m,OutputArrayOfArrays mv);
    
    • 第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。

    • 第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。

    split函数分割多通道数组转换成独立的单通道数组,按公式来看就是这样:

    分离彩色图像的实例:

    #include <opencv2/opencv.hpp>
    #include <vector>
    using namespace std;
    using namespace cv;
    
    int main() 
    {
        Mat srcImage = imread("lena.png",
            IMREAD_COLOR);
    
        if (srcImage.empty())
        {
            printf("image error!\n");
            return 0;
        }
        std::vector<Mat> channels;
        Mat aChannels[3];
        
        //利用数组分离
        split(srcImage, aChannels);
        //利用vector对象分离
        split(srcImage, channels); 
    
        // 显示原图
        namedWindow("src");
        imshow("src", srcImage);
    
        namedWindow("B");
        namedWindow("G");
        namedWindow("R");
        imshow("B", aChannels[0]);
        imshow("G", aChannels[1]);
        imshow("R", aChannels[2]);
    
        waitKey(0);
        return 0;
    }
    

    原图

    原图

    分离通道的三个图

    分离通道的三个图

    2、merge()函数

    功能:merge()函数的功能是split()函数的逆向操作,将多个数组组合合并成一个多通道的数组。

    函数原型:

    void merge(const Mat* mv, size_tcount, OutputArray dst)
    void merge(InputArrayOfArrays mv,OutputArray dst)
    
    • 第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。

    • 第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.

    • 第三个参数,dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。

    图像通道的分离与合并的实例:

    #include <opencv2/opencv.hpp>
    #include <vector>
    using namespace std;
    using namespace cv;
    
    // 图像通道的分离与合并
    ///@srcImage const Mat 原始图像
    ///@logoImage const Mat 融合图像
    ///@outputImage Mat 输出图像
    ///@splitChannel int 图像的某个通道(0--2)
    void SplitMerge(const Mat &srcImage, 
        const Mat &logoImage, 
        Mat &outputImage, 
        int splitChannel)
    {
        vector<Mat>channels;
        //把一个3通道图像转换成3个单通道图像
        //分离色彩通道
        split(srcImage, channels);
    
        // 得到其中一个通道的图像
        Mat ChannelImage = 
            channels.at(splitChannel);
    
        //将原图的蓝色通道的(50,50)坐标处
        // 右下方的一块区域和logo图进行加权操作,
        // 将得到的混合结果存到imageBlueChannel中
        addWeighted(ChannelImage(
            Rect(50, 50, logoImage.cols, 
                logoImage.rows)), 1.0,logoImage, 
            0.9, 0, ChannelImage(Rect(50, 50, 
                logoImage.cols, logoImage.rows)));
    
        // 将三个单通道重新合并成一个三通道
        merge(channels, outputImage);
    }
    
    int main() 
    {
        //【0】定义相关变量
        Mat srcImage;
        Mat logoImage;
    
        //读入图片
        logoImage = imread("2.png", 0);
        srcImage = imread("lena.png");
    
        if (!logoImage.data) 
        { 
            printf("image error!\n"); 
            return false; 
        }
        if (!srcImage.data) 
        { 
            printf("image error!\n"); 
            return false; 
        }
        Mat outputImage1, 
            outputImage2, 
            outputImage3;
    
        SplitMerge(srcImage, logoImage, 
            outputImage1, 0);
        // 显示效果图
        namedWindow("B");
        imshow("B", outputImage1);
    
        SplitMerge(srcImage, logoImage, 
            outputImage2, 1);
        // 显示效果图
        namedWindow("G");
        imshow("G", outputImage2);
    
        SplitMerge(srcImage, logoImage, 
            outputImage3, 2);
        // 显示效果图
        namedWindow("R");
        imshow("R", outputImage3);
        
        waitKey(0);
        return 0;
    }
    

    运行结果:

     

    图像通道的分离与合并

    图像通道的分离与合并

    好了,今天的学习到这里就结束了,喜欢的朋友给我点歌赞哦!!!

    展开全文
  • 判断一幅图像是否是红外还是可见光,直接在rgb颜色空间不好弄,需要转化到hsv空间进行判别,具体就是统计s通道的值是否为0或接近0,这样一来可以直接加和s通道的值,然后取个均值,最后给个阈值,当之歌均值小于给定...

          判断一幅图像是否是红外还是可见光,直接在rgb颜色空间不好弄,需要转化到hsv空间进行判别,具体就是统计s通道的值是否为0或接近0,这样一来可以直接加和s通道的值,然后取个均值,最后给个阈值,当这个均值小于给定阈值时,就可以认为这幅图像就是红外的,具体python程序如下:

    import os,sys
    import numpy as np
    def judgeimingmode(impath):
            infraredthresh=10
            im = cv2.imread(impath)
            if im is None:
                print(impath)
                return None
            imshape = im.shape
            hsvim = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
            schannelmeanval = np.sum(hsvim[:, :, 1]) / (imshape[0] * imshape[1])
            if schannelmeanval < infraredthresh:
                imagingmode = 'hongwai'
            else:
                imagingmode = 'kejianguang'
            # print('{} imagingmode={}'.format(impath, imagingmode))
    
            return imagingmode

     

    展开全文
  • RGB彩色图像由R、G、B三个通道组成,可以转成三灰度图像。 RGB彩色图像 色彩模式是数字世界中表示颜色的一种算法。在数字世界中,为了表示各种颜色,人们通常将颜色划分为若干分量。由于成色原理不同,决定了...

    RGB彩色图像由R、G、B三个通道组成,可以转成三幅灰度图像。

    RGB彩色图像

    色彩模式是数字世界中表示颜色的一种算法。在数字世界中,为了表示各种颜色,人们通常将颜色划分为若干分量。由于成色原理的不同,决定了显示器、投影仪、扫描仪这类靠色光直接合成颜色的颜色设备和打印机、印刷机这类靠使用颜料的印刷设备在生成颜色方式上的区别。

    常见的色彩模式如下:

    RGB模式:适用于显示器、投影仪、扫描仪、数码相机等。

    CMYK模式:适用于打印机、印刷机等。

    假设RGB彩色图像P的大小为H ×W, W和H分别为图像的宽度和高度。每个像素的值由R、G、B(分别为红、绿、蓝)颜色分量组成。这样,彩色图像就可以根据其颜色通道转化为三幅灰度图像,每种颜色(R, G, B)的矩阵大小为H ×W。

    实验结果

    在这里插入图片描述

    实验代码

    import cv2
    import matplotlib.pyplot as plt
    
    
    '''
    彩色图像转化为RGB三幅灰度图像
    '''
    def main():
      img='./lena.png'
      im=cv2.imread(img)
      B,G,R=cv2.split(im)
    
      #结果展示
      plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文乱码
      #子图1,原始图像
      plt.subplot(141)
      #plt默认使用三通道显示图像,所以需要制定cmap参数为gray
      #imshow()对图像进行处理,画出图像,show()进行图像显示
      #opencv的颜色通道顺序为[B,G,R],而matplotlib颜色通道顺序为[R,G,B],所以需要调换一下通道位置
      plt.imshow(im[:,:,(2,1,0)])
      plt.title('原图像')
      #不显示坐标轴
      plt.axis('off')
    
      #子图2,通道R灰度图像
      plt.subplot(142)
      plt.imshow(R,cmap='gray')
      plt.title('通道R')
      plt.axis('off')
    
      #子图3,通道G
      plt.subplot(143)
      plt.imshow(G,cmap='gray')
      plt.title('通道G')
      plt.axis('off')
    
      #子图4,B
      plt.subplot(144)
      plt.imshow(B,cmap='gray')
      plt.title('通道B')
      plt.axis('off')
    
      plt.show()
    
    
    if __name__== '__main__':
      main()
    

    参考

    色彩模式

    展开全文
  • 我已经绘制好一幅RGBA图像到nowTexSRV中,现在要做是把它原样绘制到后备缓冲区中,并用Present(0,0)将其在前台显示出来。 具体代码实现: 1.参数设置 // ***********初始化混合状态*********** /*对于两个相同...

    如有错误,麻烦指出,非常感谢!
    前提:
    DX11默认不显示alpha通道的,要想显示alpha通道需要设置一个混合状态。

    代码背景
    我已经绘制好一幅RGBA图像到nowTexSRV中,现在要做的是把它原样绘制到后备缓冲区中,并用Present(0,0)将其在前台显示出来。

    具体代码实现:
    1.参数设置

    // ***********初始化混合状态***********
    	/*对于两个相同位置的像素点,规定Csrc为源像素的颜色(从像素着色器输出的像素),
    	Cdst为目标像素的颜色(已经存在于后备缓冲区上的像素)。*/
    	//D3D11_BLEND_DESC blendDesc;
    	ZeroMemory(&blendDesc, sizeof(blendDesc));
    	auto& rtDesc = blendDesc.RenderTarget[0];
    
    	// 透明混合模式
    	// Color = SrcAlpha * SrcColor + (1 - SrcAlpha) * DestColor 
    	// Alpha = SrcAlpha
    	blendDesc.AlphaToCoverageEnable = false;
    	blendDesc.IndependentBlendEnable = false;
    	rtDesc.BlendEnable = true;
    	rtDesc.SrcBlend = D3D11_BLEND_SRC_ALPHA;
    	rtDesc.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
    	rtDesc.BlendOp = D3D11_BLEND_OP_ADD;
    	rtDesc.SrcBlendAlpha = D3D11_BLEND_ONE;
    	rtDesc.DestBlendAlpha = D3D11_BLEND_ZERO;
    	rtDesc.BlendOpAlpha = D3D11_BLEND_OP_ADD;
    	rtDesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;/*别忘了加上这个参数,否则为纯白色*/
    
    	hr = m_d3dDevice->CreateBlendState(&blendDesc, BSAlphaToCoverage.GetAddressOf());
    

    2.图像绘制
    上述处理结果是指处理得到的带有alpha通道的图像,存到nowTexSRV中。

    /*将上述处理结果原样输出到后备缓冲区*/
    	m_d3dDevContext->VSSetShader(m_vertexShader.Get(), nullptr, 0);/*使用这个顶点着色器*/
    	m_d3dDevContext->PSSetShader(m_pixelShader_output.Get(), nullptr, 0);/*使用这个片段着色器*/
    
    	/*重新设置渲染目标绑定的纹理为后备缓冲区纹理*/
    	hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.ReleaseAndGetAddressOf());
    	hr = m_d3dDevice->CreateRenderTargetView(backBuffer.Get(), nullptr, m_renderTargetView.ReleaseAndGetAddressOf());
    	
    
    	//将渲染目标视图和深度/模板缓冲区结合到管线
    	m_d3dDevContext->OMSetRenderTargets(1, m_renderTargetView.GetAddressOf(), m_depthStencilView.Get());
    	/*设置渲染状态--开启混合模式*/
    	m_d3dDevContext->OMSetBlendState(BSAlphaToCoverage.Get(), nullptr, 0xFFFFFFFF);
    
    	/*设置第3个像素着色器资源--让该着色器资源视图绑定到渲染管线的指定阶段*/
    	/*注意:设置中间纹理为着色器资源必须在重新绑定RTV之后,因为中间纹理只能作为输出或者输入*/
    	m_d3dDevContext->PSSetShaderResources(1, 1, nowTexSRV.GetAddressOf());/*这样在HLSL里对应regisgter(t1)的gTex_now存放的就是中间纹理*/			
    	
    	/*绘制四边形到后备缓冲区*/
    	m_d3dDevContext->Draw(4, 0);/*RGBA格式*/
    	//每帧更新完都需要交换下前后台的缓冲区,把后台画好的东西显示到屏幕上
    	m_swapChain->Present(0,0);	
    

    参考资料:
    混合状态相关知识以及参数设置:https://www.cnblogs.com/X-Jun/p/9346640.html

    展开全文
  • 图像深度&通道

    2019-05-13 10:31:00
    图像深度 1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这图片要么是黑色要么是白色。 4 bit : 取值范围为0 到 ( 2 的4次方 ...怎么根据图片某像素的深度值来确定那像素点的颜色呢?...
  • 图像的通道,深度

    2018-02-18 14:31:29
    图像的深度:图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这图片要么是...
  • 图像的颜色模式

    千次阅读 2009-09-15 20:19:00
    颜色模式是描述颜色的依据,用于表现色彩一种数学算法,是一幅图像用什么方法在电脑中显示或打印输出。常见颜色模式: 1、位图模式 黑白,有助于较为完整地控制灰度图打印(不理解)。只有灰度模式和多通道...
  • 图像的深度和通道

    2015-11-20 10:58:41
    图像的深度: 图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。 1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这...
  • 一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几乎趋向于0。基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法。 ​ 首先介绍去雾模型如下: 对于任意一幅输入图像,定义其暗通道...
  • 图像的深度和通道概念 图像的深度: 图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。 1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1...
  • 图像的深度和通道概念区分

    千次阅读 2017-02-19 22:00:18
    图像的深度:图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这图片要么是...
  • 图像的深度: 图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。 1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这图片...
  • 图像的深度: 图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。 1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这图片...
  • 作者统计了大量的无雾图像,发现一条规律:每一幅图像的每一个像素的RGB三个颜色通道中,总有一个通道的灰度值很低。基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法。 作者首先介绍去雾模型...
  • OpenCV—Python 暗通道图像去雾算法

    千次阅读 多人点赞 2019-07-08 14:49:04
    文章目录一、前言二、暗通道去雾原理 一、前言 何恺明的暗通道先验(dark channel prior)去雾算法是CV界...作者统计了大量的无雾图像,发现一条规律:每一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几...
  • 图像的深度: 图片是由个个像素点构成的,所有不同颜色的像素点构成了副完整的图像,计算机存储图片是以二进制来进行的。 1 bit : 用位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这图片...
  • matplotlib 图像颜色直方图

    千次阅读 2020-02-20 13:50:19
    参考学习 ...imaes:输入的图像channels:选择图像的通道mask:掩膜,是个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像...
  • 转自:图像类型 与 opencv中图像基础(大小,深度,通道) 一、图像基本类型 在计算机中,按照颜色和灰度...一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每...
  • 教程出处:http://www.tlvi.net/Ms/Show_95.html 很多初学CS的朋友对“通道”的使用原理不是很了解,在这里我就向读者讲述“通道”的基本原理——颜色通道。...图像的颜色模式决定创建颜色通道的数目。 (1)启动P...
  • python—图像到图像的映射

    千次阅读 2019-03-19 22:35:38
    这次实验的目标是将图像或者图像的一部分放置在另一幅图像中,使得它们能够和制定的区域或者标记物对齐,如下图所示: 在开始之前,先了解以下原理: 1.alpha通道通道作为图像的组成部分,是与图像的格式...
  • 读入一幅灰度图像,存放在图像矩阵F中。(imread函数)。 获得输入图像尺寸M、N、C(size函数)。并将图像矩阵F中数据由uint8类型转换为double类型以便后续处理。如果颜色通道数C>1,则将彩色图像转化为灰度图...
  • 用直方图统计像素 图像是由不同数值(颜色)的像素构成的, 像素值在整幅图像中的分布情况是该图像的一个重要属性。 本章将介绍图像直方图的概念,你将学会如何计算直方图、如何...直方图是一个简单的表格,表示一幅图像(有
  • 免费素材 ew2 Photoshop初学者教程解析通道混合器的原理 通道混合器命令可以将图像的颜色通道相互混合起到对目标颜色通道进行调整和修复的作用对于一幅偏色的图像通常是因为某种颜色过多或缺失造成的这时候可以...
  • 考虑到一幅图像的空间邻域像素在亮度及色彩上存在着极大的相关性,设计了一种新的搜索方法对灰度图像进行彩色化。首先在灰度图像中按照空间位置恒定步长递增的方式选取部分像素,并采取全局最优搜索参考样本对其上色...
  • 1、读入图像 用cv2.imread()函数来读取图像,cv2.imread(路径,图像颜色空间)(其中颜色空间默认为BGR彩图) ... cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道 可以用1、0、-1代...
  • 图像深度

    2021-01-13 17:25:38
    一幅彩色图像RGB三通道的像素位数分别为4,4,2,则最大颜色数目为2^(4+4+2) = 1024,像素深度为10位,每个像素可以是1024种颜色一种 一幅尺寸是1024*768,深度为16,则它数据量为1.5M [ (1024 * 768 * ...
  • 真彩色是指在组成一幅彩色图像的每个像素值中,有R、G、B三个基色分量,每个基色分量直接决定显示设备的基色强度产生彩色。真彩色图像就是我们平时见到的可见光R、G、B3个波段对应生成R、G、B3个通道的图像。 伪彩色...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 125
精华内容 50
关键字:

一幅图像的颜色通道