利用掩膜日趋ROI区域-人物提取
背景:在背景颜色比较单一均匀的图像上,将目标区域提取出来或用于其它图像。
思路:将图像从rgb空间转换到HSV空间,利用区域在HSV空间上的差异

使用:inRange(hsv, Scalar(35, 40, 40), Scalar(85, 255, 255), trea_leaf_mask); 函数讲背景区域的掩膜部分提取出来。
通过位运算得到目标区域的掩膜,利用掩膜提取目标区域。
主要是要分析图像在HSV空间上,前景与背景的差异。
(借用一下孟姐在百度上的图哈)

#include <iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat img = imread("d:\\Images\\mengjie2.jfif", cv::IMREAD_UNCHANGED); if (img.empty()) { printf("图像无法正常加载\n"); return 0; } Mat hsv, trea_leaf_mask,tree_trunk_mask ; cvtColor(img, hsv, COLOR_BGR2HSV);
//inRange 将hsv range1- range2区间的区域提取来 输出二值的掩码图像 掩膜与图像计算 非0区域会被提取出来
//说句废话 黑色 =0 白色 =255 inRange(hsv, Scalar(35, 40, 40), Scalar(85, 255, 255), trea_leaf_mask); inRange(hsv, Scalar(10, 40, 40), Scalar(25, 255, 200), tree_trunk_mask); Mat combinedMask;
//位运算 或 bitwise_or(trea_leaf_mask, trea_leaf_mask, combinedMask); Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5)); morphologyEx(combinedMask, combinedMask, MORPH_CLOSE, kernel); morphologyEx(combinedMask, combinedMask, MORPH_OPEN, kernel); Mat foregroundMask; bitwise_not(combinedMask, foregroundMask); Mat result(img.size(), CV_8UC3, Scalar(255, 255, 255));
//将img最后 在mask最后非0位置对应的像素复制到结果图像最后 img.copyTo(result, foregroundMask); namedWindow("original", WINDOW_FREERATIO); int window_width = 300; resizeWindow("original", Size(window_width, window_width * img.rows / img.cols)); imshow("original", img); namedWindow("foreground", WINDOW_FREERATIO); resizeWindow("foreground", Size(window_width, window_width * combinedMask.rows / combinedMask.cols)); imshow("foreground", combinedMask); namedWindow("result", WINDOW_FREERATIO); resizeWindow("result", Size(window_width, window_width * result.rows / result.cols)); imshow("result", result); // 分离 HSV 通道 std::vector<Mat> channels; split(hsv, channels); namedWindow("h", WINDOW_FREERATIO); resizeWindow("h", Size(window_width, window_width * hsv.rows / hsv.cols)); imshow("h", channels[0]); namedWindow("s", WINDOW_FREERATIO); resizeWindow("s", Size(window_width, window_width * hsv.rows / hsv.cols)); imshow("s", channels[1]); namedWindow("v", WINDOW_FREERATIO); resizeWindow("v", Size(window_width, window_width * hsv.rows / hsv.cols)); imshow("v", channels[2]); waitKey(0); cv::destroyAllWindows(); return 0; }

浙公网安备 33010602011771号