赞
踩
在图像处理领域,颜色分割是一个常见的任务,常用于识别和提取图像中的特定颜色区域。OpenCV 提供了一个非常方便的函数 inRange
来实现这一功能。在这篇博客中,我们将详细介绍 inRange
函数的用法,并通过示例代码演示如何使用它来分割图像中的颜色。
inRange
函数介绍inRange
是 OpenCV 库中的一个函数,用于检查图像像素值是否在指定的范围内,并生成一个二值图像。这个函数常用于颜色分割和阈值处理。
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
src
图像具有相同的类型和通道数,用于指定每个通道的下限值。src
图像具有相同的类型和通道数,用于指定每个通道的上限值。src
相同。像素值为 255(满足条件)或 0(不满足条件)。inRange
函数通过检查 src
图像的每个像素值是否在 lowerb
和 upperb
范围内,如果在范围内,则将对应位置的像素值设置为 255,否则设置为 0。结果保存在 dst
图像中。
假设你有一个彩色图像 src
,你想找到图像中绿色的部分,可以使用以下代码:
#include <opencv2/opencv.hpp> int main() { // 读取输入图像 cv::Mat src = cv::imread("path_to_image.jpg"); if (src.empty()) { std::cout << "Could not open or find the image" << std::endl; return -1; } // 将图像从 BGR 颜色空间转换为 HSV 颜色空间 cv::Mat src_hsv; cv::cvtColor(src, src_hsv, cv::COLOR_BGR2HSV); // 定义绿色的HSV范围 cv::Scalar lowerb(35, 100, 100); // 绿色的下界(H, S, V) cv::Scalar upperb(85, 255, 255); // 绿色的上界(H, S, V) // 应用inRange函数 cv::Mat mask; cv::inRange(src_hsv, lowerb, upperb, mask); // 显示结果 cv::imshow("Original Image", src); cv::imshow("Mask", mask); cv::waitKey(0); return 0; }
读取输入图像:
cv::Mat src = cv::imread("path_to_image.jpg");
首先,我们使用 cv::imread
函数读取图像,并检查图像是否成功读取。
转换颜色空间:
cv::Mat src_hsv;
cv::cvtColor(src, src_hsv, cv::COLOR_BGR2HSV);
由于颜色分割通常在 HSV 颜色空间中效果更好,我们将图像从 BGR 颜色空间转换为 HSV 颜色空间。
定义颜色范围:
cv::Scalar lowerb(35, 100, 100); // 绿色的下界(H, S, V)
cv::Scalar upperb(85, 255, 255); // 绿色的上界(H, S, V)
我们定义绿色的 HSV 范围,通过调整这两个值,可以检测不同的颜色。
应用 inRange
函数:
cv::Mat mask;
cv::inRange(src_hsv, lowerb, upperb, mask);
使用 inRange
函数,我们生成一个二值图像 mask
,其中绿色部分的像素值为 255,其他部分为 0。
显示结果:
cv::imshow("Original Image", src);
cv::imshow("Mask", mask);
最后,我们使用 cv::imshow
函数显示原始图像和结果二值图像。
src
和下界 lowerb
以及上界 upperb
必须具有相同的通道数。如果 src
是三通道的彩色图像,那么 lowerb
和 upperb
也应该是三通道的。dst
是一个单通道的二值图像,只有两种可能的像素值:0 和 255。通过 inRange
函数,我们可以方便地进行颜色分割,提取图像中的特定颜色区域,从而为后续的图像处理和分析打下基础。希望这篇博客对你理解和使用 inRange
函数有所帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。