#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. **直方图均衡化**:这是一种增强图像对比...
14. **min_max_gray**: 这个函数可以找到区域内最小和最大的灰度值,这对于阈值设定和其他图像分割操作具有指导意义。 总的来说,Halcon提供的这些功能使开发者能够深入地分析和理解图像中的Region区域,从而实现...
最常见的是加权平均法,即灰度值 = 0.299R + 0.587G + 0.114B。这种方法能保留图像的基本结构和对比度。 2. **中值滤波**: 中值滤波是一种非线性滤波方法,用于去除图像中的椒盐噪声或斑点噪声。它的工作原理是对...
它通过在图像上移动一个模板(通常是方形或圆形),并将模板覆盖区域内所有像素的灰度值取平均,用这个平均值来替换模板中心像素的值。例如,一个3x3的模板会包括9个像素,新像素值将是这9个像素的平均值。这种方法...
加载图像后,可以将RGB三通道图像转换为灰度图像,通过取R、G、B三个分量的平均值或使用特定的灰度转换公式(例如,Y = 0.299R + 0.587G + 0.114B)。 接下来,我们讨论几何变换。这包括图像的平移、旋转和缩放。...
- **局部平均函数**:为了减少图像局部细节变化的影响,引入了局部平均函数\( g \),它计算以像素为中心的圆形区域内所有像素灰度值的平均值。 - **圆弧扫描**:定义了一系列离散的圆弧曲线,通过计算这些曲线上的...
二值化的实现通常基于阈值分割,即将像素的灰度值与预设阈值比较,高于阈值的像素被设置为白色,低于或等于阈值的像素被设置为黑色。选择合适的阈值是二值化效果好坏的关键,可以采用全局阈值、局部阈值或者自适应...
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. **高斯噪声**:在实验中,图像首先被添加了零均值的高斯噪声,这是模拟现实世界中常见的随机噪声...