通道是指調色板裏的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的定義好的線框
}