opencv中通道合并和通道分离CV::merge CV::mean

本文介绍如何使用OpenCV的cv::split()和cv::merge()函数来分离和合并多通道图像。通过示例代码展示了如何将图像分解为单独的颜色通道,并重新组合这些通道以创建纯红、绿、蓝视图。

在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理;有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像。opencv2和opencv3中实现图像通道的合并与分离的函数分别是cv::split()和cv::merge()。


1、多通道图像的分离

cv::split()的具体调用方法如下:

  1. void cv::split(  
  2.     const cv::Mat& mtx, //输入图像  
  3.     vector<Mat>& mv // 输出的多通道序列(n个单通道序列)  
  4. );  
void cv::split(
    const cv::Mat& mtx, //输入图像
    vector<Mat>& mv // 输出的多通道序列(n个单通道序列)
);

2、图像多个通道的合并

cv::merge()的具体调用方法如下:

  1. void merge(  
  2.     const vector<cv::Mat>& mv, // 输入的多通道序列(n个单通道序列)  
  3.     cv::OutputArray dst // 输出图像,包含mv  
  4. );  
void merge(
    const vector<cv::Mat>& mv, // 输入的多通道序列(n个单通道序列)
    cv::OutputArray dst // 输出图像,包含mv
);


代码示例如下:

  1. #include <opencv2/opencv.hpp>  
  2.   
  3. int main()  
  4. {  
  5.     cv::Mat src = imread(”lenna.jpg”, cv::IMREAD_COLOR);  
  6.     cv::imshow(”src”, src);  
  7.   
  8.     // Split the image into different channels  
  9.     std::vector<cv::Mat> rgbChannels(3);  
  10.     split(src, rgbChannels);  
  11.   
  12.     // Show individual channels  
  13.     cv::Mat blank_ch, fin_img;  
  14.     blank_ch = cv::Mat::zeros(cv::Size(src.cols, src.rows), CV_8UC1);  
  15.   
  16.     // Showing Red Channel  
  17.     // G and B channels are kept as zero matrix for visual perception  
  18.     std::vector<cv::Mat> channels_r;  
  19.     channels_r.push_back(blank_ch);  
  20.     channels_r.push_back(blank_ch);  
  21.     channels_r.push_back(rgbChannels[2]);  
  22.   
  23.     /// Merge the three channels  
  24.     cv::merge(channels_r, fin_img);  
  25.     cv::imshow(”R”, fin_img);  
  26.       
  27.   
  28.     // Showing Green Channel  
  29.     std::vector<cv::Mat> channels_g;  
  30.     channels_g.push_back(blank_ch);  
  31.     channels_g.push_back(rgbChannels[1]);  
  32.     channels_g.push_back(blank_ch);  
  33.     cv::merge(channels_g, fin_img);  
  34.     cv::imshow(”G”, fin_img);  
  35.       
  36.   
  37.     // Showing Blue Channel  
  38.     std::vector<cv::Mat> channels_b;  
  39.     channels_b.push_back(rgbChannels[0]);  
  40.     channels_b.push_back(blank_ch);  
  41.     channels_b.push_back(blank_ch);  
  42.     cv::merge(channels_b, fin_img);  
  43.     cv::imshow(”B”, fin_img);  
  44.       
  45.     cv::waitKey(0);  
  46.     return 0;  
  47. }  
#include <opencv2/opencv.hpp>

int main()
{
    cv::Mat src = imread("lenna.jpg", cv::IMREAD_COLOR);
    cv::imshow("src", src);

    // Split the image into different channels
    std::vector<cv::Mat> rgbChannels(3);
    split(src, rgbChannels);

    // Show individual channels
    cv::Mat blank_ch, fin_img;
    blank_ch = cv::Mat::zeros(cv::Size(src.cols, src.rows), CV_8UC1);

    // Showing Red Channel
    // G and B channels are kept as zero matrix for visual perception
    std::vector<cv::Mat> channels_r;
    channels_r.push_back(blank_ch);
    channels_r.push_back(blank_ch);
    channels_r.push_back(rgbChannels[2]);

    /// Merge the three channels
    cv::merge(channels_r, fin_img);
    cv::imshow("R", fin_img);


    // Showing Green Channel
    std::vector<cv::Mat> channels_g;
    channels_g.push_back(blank_ch);
    channels_g.push_back(rgbChannels[1]);
    channels_g.push_back(blank_ch);
    cv::merge(channels_g, fin_img);
    cv::imshow("G", fin_img);


    // Showing Blue Channel
    std::vector<cv::Mat> channels_b;
    channels_b.push_back(rgbChannels[0]);
    channels_b.push_back(blank_ch);
    channels_b.push_back(blank_ch);
    cv::merge(channels_b, fin_img);
    cv::imshow("B", fin_img);

    cv::waitKey(0);
    return 0;
}


显示结果:



2017.04.27


                </div>
当然,我可以帮你编写这段代码。以下是一个基于PythonOpenCV实现的示例代码: ```python import cv2 import numpy as np def adjust_color_balance(image): # 将图像转换为Lab颜色空间 lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab) # 提取亮度通道 l, a, b = cv2.split(lab) # 计算亮度通道的平均值 l_mean = np.mean(l) # 计算每个像素的亮度比例并调整亮度 adjusted_l = np.where(l > l_mean, l + 10, l - 10) # 合并调整后的亮度通道色度通道 adjusted_lab = cv2.merge((adjusted_l, a, b)) # 将图像转换回BGR颜色空间 adjusted_image = cv2.cvtColor(adjusted_lab, cv2.COLOR_Lab2BGR) return adjusted_image # 读取摄像头 capture = cv2.VideoCapture(0) while True: # 读取摄像头传入的图像 ret, frame = capture.read() # 确保成功读取图像 if not ret: break # 调整图像的颜色平衡 adjusted_frame = adjust_color_balance(frame) # 显示调整后的图像 cv2.imshow("Adjusted Image", adjusted_frame) # 按下 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭窗口 capture.release() cv2.destroyAllWindows() ``` 这段代码会打开你的摄像头,并不断读取传入的图像。然后,它会通过记录各个位置颜色通道明暗比例来改变不同像素的亮度,以抵消色差。最后,调整后的图像会显示在窗口中。你可以按下 'q' 键来退出程序。 请注意,这只是一个简单的示例,你可能需要根据你的需求进行进一步的调整优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值