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的定義好的線框

}

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章