OpenCV提取前景物体颜色(HSV值)

基本思路为;

  1. 转灰度图,计算梯度,并归一化到0~255;
  2. 使用Otsu方法,对归一化的梯度图像进行二值化处理(处理后,边缘为白色亮线,其余为黑色);
  3. 获取二值图像非零像素最小包围盒Roi;
  4. 统计Roi之外区域像素平均RGB值,作为背景RGB值;
  5. 原始图像转HSV彩色,并抠取Roi区域图像;
  6. 对抠取的HSV彩色图像进行Kmeans聚类,k=2;
  7. 对聚类的结果分别统计其RGB均值,判定与背景RGB值相近的为背景区域(第4步结果),否则为前景区域;
  8. 求前景区域HSV值均值;

前提条件:背景较为单一的场景,没有梯度变化明显的纹理特征。

实现代码如下:

#include <iostream>
#include <filesystem>
#include<fstream>
#include <opencv2/opencv.hpp>

namespace fs = std::filesystem;

cv::Rect findMinBoundingPoly(cv::Mat& binaryImage);


void extractEdge(cv::Mat& image, cv::Mat &edge)
{
    cv::Mat tmp = image.clone();
    if (image.channels() == 3) {
        cv::cvtColor(image, tmp, cv::COLOR_BGR2GRAY);
    }

    // 计算图像的梯度幅值
    cv::Mat gradX, gradY, gradMag;
    cv::Sobel(tmp, gradX, CV_32F, 1, 0); // 水平方向梯度
    cv::Sobel(tmp, gradY, CV_32F, 0, 1); // 垂直方向梯度
    cv::magnitude(gradX, gradY, gradMag);  // 梯度幅值

    // 归一化梯度幅值到 0-255 范围
    cv::Mat normalizedGradMag;
    cv::normalize(gradMag, normalizedGradMag, 0, 255, cv::NORM_MINMAX, CV_8U);

    // 自适应二值化
    //cv::Mat binaryImage;
    double otsuThreshold = threshold(
        normalizedGradMag,             // 输入图像
        edge,       // 输出图像
        0,                 // 阈值(Otsu 二值化时设
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值