通道是指调色板里的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的定义好的线框
}