#include <cmath>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
const int kvalue = http://blog.csdn.net/kh1445291129/article/details/15;//双边滤波邻域大小
const double PI = 3.14;//圆周率
int graylevel(Mat image, Mat dst, Point cen, int r)//求取圆形区域内的平均灰度值
{
int graysum = 0, n = 0;
for(int i = (cen.y - r); i <= (cen.y + r); ++i)//访问矩形框内的像素值
{
uchar* data = image.ptr(i);
for(int j = (cen.x - r); j <= (cen.x + r); ++j)
{
double d = (i-cen.y)*(i-cen.y) + (j-cen.x)*(j-cen.x);
if(d < r*r)
{
++n;
graysum += (int)data[j];
}
}
}
for(int i = (cen.y - r); i <= (cen.y + r); ++i)//画出圆,圆内像素值为平均灰度值
{
uchar* temp = dst.ptr(i);
for(int j = (cen.x - r); j <= (cen.x + r); ++j)
{
double d = (i-cen.y)*(i-cen.y) + (j-cen.x)*(j-cen.x);
if(d < r*r)
{
temp[j] = (int)(graysum / n);
}
}
}
return(graysum / n);
}
int main()
{
Mat src_color = imread("1.png");//读取原彩色图
imshow("原图-彩色", src_color);
Mat src_gray;//彩色图像转化成灰度图
cvtColor(src_color, src_gray, COLOR_BGR2GRAY);
imshow("原图-灰度", src_gray);
//imwrite("src_gray.png", src_gray);
//声明一个单通道图像,像素值全为0,用来将霍夫变换检测出的圆画在上面
Mat dst(src_gray.size(), src_gray.type());
dst = Scalar::all(0);
Mat bf;//对灰度图像进行双边滤波
bilateralFilter(src_gray, bf, kvalue, kvalue*2, kvalue/2);
//imshow("灰度双边滤波处理", bf);
//imwrite("src_bf.png", bf);
vector circles;//声明一个向量,保存检测出的圆的圆心坐标和半径
HoughCircles(bf, circles, CV_HOUGH_GRADIENT, 1.5, 20, 130, 38, 10, 50);//霍夫变换检测圆
std::vector v;//保存圆心的横坐标减纵坐标的绝对值,用于区分两排灯
cout << "x=/ty=/tr=/ts=/tg=" << endl;
for(size_t i = 0; i < circles.size(); i++)//把霍夫变换检测出的圆画出来
{
Point center(cvRound(circles[0]), cvRound(circles[1]));
int radius = cvRound(circles[2]);
double s = 0;//计算圆的面积
s = PI * radius * radius;
int average = 0;
average = graylevel(bf, dst, center, radius);//计算平均灰度,并画出圆
circle( dst, center, 2, Scalar(255), -1, 8, 0 );//画出圆心
circle( dst, center, radius, Scalar(255), 1, 8, 0 );//画出圆的轮廓
v.push_back(abs(center.x-center.y));//存储圆心的横坐标减纵坐标的绝对值,用于区分两排灯
cout << center.x << "/t" << center.y << "/t" << radius << "/t" << s << "/t" << average << endl;//在控制台输出圆心坐标和半径
}
sort(v.begin(), v.end());//从小到大排序
std::vector points1, points2;//声明点向量,分别存储两排灯的圆心坐标
for (size_t i = 0; i < circles.size(); i++)//用来区分两排灯
{
Point center(cvRound(circles[0]), cvRound(circles[1]));
if (abs(center.x-center.y) < v[12])
points1.push_back(Point(center.x, center.y));//存储从左上到右下那排灯的圆心坐标
else
points2.push_back(Point(center.x, center.y));//存储从左下到右上那排灯的圆心坐标
}
cv::Vec4f line1, line2;//拟合直线
fitLine(Mat(points1), line1, CV_DIST_L2, 0, 0.01, 0.01);
fitLine(Mat(points2), line2, CV_DIST_L2, 0, 0.01, 0.01);
int x01 = (int)line1[2];
int y01 = (int)line1[3];
int x11 = (int)(x01 + 300*line1[0]);
int y11 = (int)(y01 + 300*line1[1]);
int x21 = (int)(x01 - 300*line1[0]);
int y21 = (int)(y01 - 300*line1[1]);
int x02 = (int)line2[2];
int y02 = (int)line2[3];
int x12 = (int)(x02 + 300*line2[0]);
int y12 = (int)(y02 + 300*line2[1]);
int x22 = (int)(x02 - 300*line2[0]);
int y22 = (int)(y02 - 300*line2[1]);
cv::line(dst, Point(x11, y11), Point(x21, y21), Scalar(255), 1);//画出直线
cv::line(dst, Point(x12, y12), Point(x22, y22), Scalar(255), 1);
imshow("特征提取", dst);
imwrite("chuli.png", dst);
waitKey();
}
源码来自:
http://www.eyesourcecode.com/forum-OpenCV-1.html
- 大小: 39.5 KB
分享到:
相关推荐
1. **灰度转换**:彩色图像到灰度图像的转换是通过将RGB三原色通道的亮度信息合并为单个灰度值来实现的。通常使用加权平均公式,如`灰度 = 0.299R + 0.587G + 0.114B`。 2. **直方图均衡化**:这是一种增强图像对比...
最常见的是加权平均法,即灰度值 = 0.299R + 0.587G + 0.114B。这种方法能保留图像的基本结构和对比度。 2. **中值滤波**: 中值滤波是一种非线性滤波方法,用于去除图像中的椒盐噪声或斑点噪声。它的工作原理是对...
14. **min_max_gray**: 这个函数可以找到区域内最小和最大的灰度值,这对于阈值设定和其他图像分割操作具有指导意义。 总的来说,Halcon提供的这些功能使开发者能够深入地分析和理解图像中的Region区域,从而实现...
加载图像后,可以将RGB三通道图像转换为灰度图像,通过取R、G、B三个分量的平均值或使用特定的灰度转换公式(例如,Y = 0.299R + 0.587G + 0.114B)。 接下来,我们讨论几何变换。这包括图像的平移、旋转和缩放。...
- **局部平均函数**:为了减少图像局部细节变化的影响,引入了局部平均函数\( g \),它计算以像素为中心的圆形区域内所有像素灰度值的平均值。 - **圆弧扫描**:定义了一系列离散的圆弧曲线,通过计算这些曲线上的...
与均值滤波不同,中值滤波不是求平均值,而是把模板覆盖区域内的像素灰度值进行排序后选择中值作为新的像素值。这意味着对于一个包含9个像素的3x3模板,中值滤波会选取这些像素灰度值的中位数作为中心像素的灰度值。...
二值化的实现通常基于阈值分割,即将像素的灰度值与预设阈值比较,高于阈值的像素被设置为白色,低于或等于阈值的像素被设置为黑色。选择合适的阈值是二值化效果好坏的关键,可以采用全局阈值、局部阈值或者自适应...
Histograph和Histogram分别提供曲线图和柱状图形式的灰度值分布,Quantify计算图像的量化信息,如平均灰度、极值和面积,Centroid计算图形的质心,LineProfile分析直线灰度值,ROI轮廓线分析则针对感兴趣区域的特征...
掩码通常是一个二维数组,其中的值表示某个区域内点的位置。在标题提到的"Circ"函数中,它允许用户生成广义圆形或椭圆形的掩码,这种掩码可以用于筛选图像像素、计算区域特性或者进行各种基于形状的分析。 首先,...
这种滤波器通常使用一个模板(如3x3或5x5的窗口),并将窗口内所有像素的灰度值加权平均。例如,一个3x3的模板会对目标像素及其周围8个像素取均值。均值滤波适用于平滑图像,消除高频噪声,但它可能会模糊图像的边缘...
图像分段线性变换是一种非线性的灰度变换技术,它将图像的灰度值分布通过分段线性函数映射到新的灰度值区间,以增强图像的对比度。在MATLAB中,`imadjust`函数可以实现这一功能。例如,我们可以将输入图像中亮度值...
- 使用迭代方法调整阈值,直到前景和背景的平均灰度值不再改变,以找到最佳分割点。 3. **形态学处理**: - `im2bw(im,double(TK)/255)`:将灰度图像转换为二值图像,其中阈值为 `TK`。 - `strel('disk',5)`:...
在均值滤波中,每个像素点的新值是其周围一定区域内像素点的平均值。这种区域通常选择为以待处理像素为中心的方形或圆形窗口。描述中提到了3*3、5*5、9*9等不同大小的矩形窗口,这些代表了不同的邻域范围。较大的...
而自编的中值滤波函数`midfilt`则是将模板区域内的所有元素排列,取中位数作为模板中心位置的新像素值。高斯滤波函数`gaussfilt`则利用高斯核进行卷积运算,对图像进行平滑处理,适用于去除高斯噪声。 在处理含有...
获取标记点近似成像中心及成像区域,在成像区域内沿四个方向扫描得到像素级边缘点;利用灰度差重心法进行亚像素定位;对亚像素级边缘点进行椭圆拟合,得到标记点成像中心位置。实验结果表明,像素级边缘检测算法运行...
- **灰度比较**:对每个像素,比较其与8个相邻像素的灰度值,如果邻域像素值小于中心像素,对应位设为0,否则设为1。 - **二进制编码**:将8个位组合成一个二进制数,形成LBP码。 - **模式统计**:统计不同LBP码出现...
对于偶数大小的邻域,中值是中间两个灰度值的平均值。中值滤波在保留边缘细节的同时能有效地去除孤立噪声点。 4. **高斯噪声**:在实验中,图像首先被添加了零均值的高斯噪声,这是模拟现实世界中常见的随机噪声...