计算机系统应用教程网站

网站首页 > 技术文章 正文

利用HSV图像分割 hsv图像处理

btikc 2024-09-30 13:12:35 技术文章 11 ℃ 0 评论

因项目需要用到图像分割得部分,今天就简单介绍下分割得部分。

我在这里用到得是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;

}

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表