1.步骤
- 高斯模糊
- BGR转hsv
- 阀值分割
- 添加掩膜
2. 实现
原图:
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
cv::Mat img = cv::imread("/Users/xialz/Downloads/bird.png");
cv::Mat blur;
cv::GaussianBlur(img, blur, cv::Size(5, 5), 0);
cv::Mat hsv;
cv::cvtColor(blur, hsv, cv::COLOR_BGR2HSV);
cv::Mat mask;
cv::inRange(hsv, cv::Scalar(55, 0, 0), cv::Scalar(118,255,255), mask);
cv::imshow("mask", mask);
cv::Mat res;
cv::bitwise_and(img, img, res, mask);
cv::imshow("res", res);
cv::waitKey(0);
return 0;
}
mask:
结果图:
=几点说明=
- 为何转hsv
因为像素B,G和R的取值与落在物体上的光相关,因此这些值也彼此相 关,无法准确描述像素。相反,HSV空间中,三者相对独立,可以准确描述像素的亮度,饱和度 和色度。 - inRange函数
CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);
inRange函数是OpenCV提供的用于检测图像矩阵的元素各通道值是否介于两个指定的矩阵或标量lowerb和upperb对应通道值之间,如果检测图像的某个像素的各个通道值分别大于等于lowerb对应元素或标量的各个通道值且小于等于upperb对应元素或标量的各个通道值,则结果矩阵对应元素的各个通道被设置为255,否则被设置为0。
- bitwise_and函数
CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2,
OutputArray dst, InputArray mask = noArray());
对src1和src2像素值进行按位与运算,mask为掩膜(关于掩膜的描述)
- 阀值选取
阈值分割,这可能是一个相当繁琐的任务。即 使我们可能想到通过使用颜色选择器工具来了解像素值,但是仍然需要进行不断的尝试,以便在 所有像素中获取期望的像素,有些时候这也可能是一项艰巨的任务