网站首页 > 技术文章 正文
因项目需要用到图像分割得部分,今天就简单介绍下分割得部分。
我在这里用到得是HSV分量去分割,当然也可以用RGB去分割图像,HSV比RGB可能分割得更加细致及范围较广,所以这里简单介绍用HSV分割得图像。
我在这里演示用到了回调函数去分割,这里是为了让大家看清楚HSV各分量得作用,将各个分量分离出来调节,可以很好得看到各分量在图像中起到得作用。
int hmin = 0; int hmin_Max = 360; int hmax = 360; int hmax_Max = 360; //饱和度 int smin = 0; int smin_Max = 255; int smax = 255; int smax_Max = 255; //亮度 int vmin = 106; int vmin_Max = 255; int vmax = 250; int vmax_Max = 255; //回调函数 void callBack(int, void*) { Mat bgr; //灰度值归一化 Mat hsv; //HSV图像 Mat img = imread("C:/Users/test1/Desktop/Street.jpg"); Mat dst = Mat::zeros(img.size(), CV_32FC3); //输出图像分配内存 Mat mask; //掩码 img.convertTo(bgr, CV_32FC3, 1.0 / 255, 0); //彩色图像的灰度值归一化,图像大小没有变化,但是类型UINT8变为了FLOAT32位 cvtColor(bgr, hsv, COLOR_BGR2HSV); //颜色空间转换 inRange(hsv, Scalar(hmin, smin / float(smin_Max), vmin / float(vmin_Max)), Scalar(hmax, smax / float(smax_Max), vmax / float(vmax_Max)), mask);//多通道hsv图中分割 //分割 for (int r = 0; r < bgr.rows; r++) { for (int c = 0; c < bgr.cols; c++) { if (mask.at<uchar>(r, c) == 255) { dst.at<Vec3f>(r, c) = bgr.at<Vec3f>(r, c); } } } namedWindow("dst", WINDOW_NORMAL); imshow("dst", dst); dst.convertTo(dst, CV_8UC3, 255.0, 0); } void coloSegmentation() { Mat img = imread("C:/Users/test1/Desktop/Street.jpg"); namedWindow("src", WINDOW_NORMAL); imshow("src", img); // namedWindow("dst", WINDOW_AUTOSIZE ); //定义输出图像的显示窗口 namedWindow("dst", WINDOW_NORMAL); //创建处理窗口 //调节色相 H createTrackbar("hmin", "dst", &hmin, hmin_Max, callBack); createTrackbar("hmax", "dst", &hmax, hmax_Max, callBack); //调节饱和度 S createTrackbar("smin", "dst", &smin, smin_Max, callBack); createTrackbar("smax", "dst", &smax, smax_Max, callBack); //调节亮度 V createTrackbar("vmin", "dst", &vmin, vmin_Max, callBack); createTrackbar("vmax", "dst", &vmax, vmax_Max, callBack); callBack(0, 0); waitKey(0); }
有时我们不知道某一点的HSV分量是多少,我们也可以采用下面的方法,通过鼠标点击得到该点的HSV分量,来精确的对图像进行分割。
//鼠标点击 返回HSV分量 void mouse_callback(int event, int x, int y, int flags, void*param) { Mat src_img = imread("C:/Users/test1/Desktop/Street.jpg"); Mat hsv_img; Point p(x, y); cvtColor(src_img, hsv_img, COLOR_BGR2HSV); switch (event) { case EVENT_LBUTTONDOWN: { printf("h=%d\t", hsv_img.at<Vec3b>(p)[0]); printf("s=%d\t", hsv_img.at<Vec3b>(p)[1]); printf("v=%d\n", hsv_img.at<Vec3b>(p)[2]); circle(hsv_img, p, 10, Scalar(0,0,255), 3); } break; } }
我们用到更多的分割方法应该是利用图像的灰度值进行分割,所以这里就简单写了下灰度的方法。
//获取各点灰度值
void mouse_callback(int event, int x, int y, int flags, void* param)
{
Mat src_img = imread("C:/Users/test1/Desktop/Street.jpg");
Mat gray_img;
Point p(x, y);
cvtColor(src_img, gray_img, COLOR_BGR2GRAY);
switch (event)
{
case EVENT_LBUTTONDOWN:
{
printf("h=%d\t", gray_img.ptr<uchar>(y)[x]);
printf("h=%d\t", gray_img.at<uchar>(y, x));
circle(gray_img, p, 10, Scalar(0,0,255), 3);
}
break;
}
}
猜你喜欢
- 2024-09-30 OPENCV-python 第一天 python opencv教程
- 2024-09-30 Python帮您十步搞定人脸检测 人脸检测 python
- 2024-09-30 OpenCV学习笔记(一)之图像金字塔-上采样与降采样与DOG
- 2024-09-30 Ubuntu18.04LTS下OpenCV的配置 ubuntu opencv4
- 2024-09-30 计算机视觉之Opencv(1)——基本操作
- 2024-09-30 OpenCV系列教程_03 opencv官方教程
- 2024-09-30 CV之 HOG特征描述算子-行人检测 卜算子 黄州定慧院寓居作
- 2024-09-30 OpenCV SURF特征点检测和匹配 opencv特征提取方法
- 2024-09-30 Opencv从零开始 - [启蒙篇] - 读取、几何变换
- 2024-09-30 密码忘记了?没事,我早就用Python给你监听了
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)