利用掩膜日趋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; }

 

posted @ 2025-07-10 12:07  Wind_Swing_Dunn  阅读(27)  评论(0)    收藏  举报