灵活的运用分离与合并以减少数据处理量,加快代码的处理效果。

    1. #include <opencv2\opencv.hpp>
    2. #include <iostream>
    3. #include <vector>
    4. using namespace std;
    5. using namespace cv;
    6. int main()
    7. {
    8. Mat img = imread("lena.png");
    9. if (img.empty())
    10. {
    11. cout << "请确认图像文件名称是否正确" << endl;
    12. return -1;
    13. }
    14. Mat HSV;
    15. cvtColor(img, HSV, COLOR_RGB2HSV);
    16. Mat imgs0, imgs1, imgs2; //用于存放数组类型的结果
    17. Mat imgv0, imgv1, imgv2; //用于存放vector类型的结果
    18. Mat result0, result1, result2; //多通道合并的结果
    19. //输入数组参数的多通道分离与合并
    20. Mat imgs[3];
    21. split(img, imgs);
    22. imgs0 = imgs[0];
    23. imgs1 = imgs[1];
    24. imgs2 = imgs[2];
    25. imshow("RGB-B通道", imgs0); //显示分离后B通道的像素值
    26. imshow("RGB-G通道", imgs1); //显示分离后G通道的像素值
    27. imshow("RGB-R通道", imgs2); //显示分离后R通道的像素值
    28. imgs[2] = img; //将数组中的图像通道数变成不统一
    29. merge(imgs, 3, result0); //合并图像
    30. //imshow("result0", result0); //imshow最多显示4个通道,因此结果在Image Watch中查看
    31. Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
    32. imgs[0] = zero;
    33. imgs[2] = zero;
    34. merge(imgs, 3, result1); //用于还原G通道的真实情况,合并结果为绿色
    35. imshow("result1", result1); //显示合并结果
    36. //输入vector参数的多通道分离与合并
    37. vector<Mat> imgv;
    38. split(HSV, imgv);
    39. imgv0 = imgv.at(0);
    40. imgv1 = imgv.at(1);
    41. imgv2 = imgv.at(2);
    42. imshow("HSV-H通道", imgv0); //显示分离后H通道的像素值
    43. imshow("HSV-S通道", imgv1); //显示分离后S通道的像素值
    44. imshow("HSV-V通道", imgv2); //显示分离后V通道的像素值
    45. imgv.push_back(HSV); //将vector中的图像通道数变成不统一
    46. merge(imgv, result2); //合并图像
    47. //imshow("result2", result2); /imshow最多显示4个通道,因此结果在Image Watch中查看
    48. waitKey(0);
    49. return 0;
    50. }