opencv读取颜色通道

通道是指调色板里的BGR:在这里插入图片描述,这三个便代表着通道,我们人眼看到的图像一般就是由三通道不同的配色组成,他们的值为0~255之间,灰色度则可以用单通道表示出来。

代码实现的效果图如下,图中分别将三个通道分离成单通道,当分离后只显示单通道时,
例如:在这里插入图片描述,将三通道分离后只看一通道其他两通道被挪开,出来的效果图为白色;在这里插入图片描述,当分离后所要求的的通道后,其余通道为黑色;而灰色则是在中间范围。

//jun_军

#include <opencv2/opencv.hpp>

#include <iostream>

#include <highgui.h>

#include <vector>

//#include "stdafx.h"

 

using namespace std;

using namespace cv;

 

const int Kvalue = 15;

void ju();

 

 

Mat rg = imread("C:/Users/asus/Documents/Tencent Files/604803231/FileRecv/0.jpg");

Mat bluechannel;

Mat rg_1(rg.size(), rg.type());

 

Mat dst, edge, gray;

 

int main(int argc, char** argv) {
    
    

 

    rg_1 = Scalar::all(0);//声明一个三通道图像,像素值全为0,用来将霍夫变换检测出的圆画在上面

 

    Mat rg_gray;//彩色图像转化成灰度图

    cvtColor(rg, rg_gray, COLOR_RGB2GRAY);

 

    //Mat greenchannel;

    //Mat redchannel;

    vector<Mat> channels;

 

    if (!rg.data) {
    
    

         printf("could not load image...\n");

         return -1;

    }

 

    ju();//调用自定义的画矩形框函数

 

          //通道分离

    split(rg, channels);//使用通道分离函数

    bluechannel = channels.at(0);

    /*greenchannel = channels.at(1);

    redchannel = channels.at(2);*/

 

    //边缘检测

    dst.create(bluechannel.size(), bluechannel.type());

    blur(bluechannel, edge, Size(3, 3));//先使用3x3内核降噪

    Canny(edge, edge, 3, 9, 3);         //运行canny算子

 

                                            //ju_l();

 

                                            //霍夫原理找圆

    vector<Vec3f> circles;

    HoughCircles(rg_gray, circles, CV_HOUGH_GRADIENT,

         1.6, //累加器图像的分辨率,增大则分辨率变小

         10,  //很重要的一个参数,告诉两个圆之间的距离的最小距离,如果已知一副图像,可以先行计

              //算出符合自己需要的两个圆之间的最小距离。

         230, //canny算法的阈值上限,下限为一半(即100以上为边缘点,50以下抛弃,中间视是否相连而定)

         40,  //决定成圆的多寡 ,一个圆上的像素超过这个阈值,则成圆,否则丢弃

         72,  //最小圆半径,这个可以通过图片确定你需要的圆的区间范围

         85   //最大圆半径

         );

 

    cout << circles.size() << endl;

    cout << "x=\ty=\tr=" << endl;

    for (size_t i = 0; i < circles.size(); i++)//把霍夫变换检测出的圆画出来

    {
    
    

         Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));

         int radius = cvRound(circles[i][2]);

 

         circle(rg_1, center, 0, Scalar(0, 0, 255), -1, 8, 0);

         circle(rg_1, center, radius, Scalar(255, 0, 0), 1, 8, 0);

 

         cout << cvRound(circles[i][0]) << "\t" << cvRound(circles[i][1]) << "\t"

             << cvRound(circles[i][2]) << endl;//在控制台输出圆心坐标和半径                

    }

 

    imshow("input image", rg);

    //imshow("<1>蓝色通道图像", bluechannel);

    imshow("取圆", rg_1);

    imshow("边缘检测效果图", edge);

    //imshow("<2>绿色通道图像", greenchannel);

    //imshow("<3>红色通道图像", redchannel);

 

    waitKey(0);

    return 0;

}

 

void ju() {
    
    

    Rect rect = Rect(80, 188, 148, 148); //前两参数为起始坐标,后两参数为所画矩形的宽高

    Scalar color = Scalar(0, 0, 255);       //定义矩形线框的颜色

    rectangle(rg_1, rect, color, 2, LINE_8); //在背景图像上画一线宽为2的定义好的线框

}

 

 

猜你喜欢

转载自blog.csdn.net/weixin_44868057/article/details/106199250
今日推荐