OpenCV中取ROI区域RGB的均值,求方差,ROI区域颜色是否明显区分

#include <iostream>
#include <math.h>

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#define REC_W_H 30
using namespace std;
int main()
{
    
    IplImage *res, *dst;
    IplImage *dst1, *dst2, *dst3;
    CvRect rect;
    CvRect rect1, rect2, rect3;
    rect.x = 1200, rect.y = 180, rect.width = REC_W_H, rect.height = REC_W_H;//ROI0 的坐标以及大小
    rect1.x = 1200, rect1.y = 240, rect1.width = REC_W_H, rect1.height = REC_W_H;//ROI1 的坐标以及大小
    rect2.x = 1230, rect2.y = 510, rect2.width = REC_W_H, rect2.height = REC_W_H;//ROI2 的坐标以及大小
    rect3.x = 1230, rect3.y = 560, rect3.width = REC_W_H, rect3.height = REC_W_H;//ROI3 的坐标以及大小
    res = cvLoadImage("d:/project/tt/1.bmp");//载入一张图片
    dst = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间
    dst1 = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间1
    dst2 = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间2
    dst3 = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间3
    //创建窗口
    cvNamedWindow("res", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("dst1", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("dst2", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("dst3", CV_WINDOW_AUTOSIZE);

    //设置ROI区域
    cvSetImageROI(res, rect);
    //提取ROI
    cvCopy(res, dst);


    cvSetImageROI(res, rect1);
    cvCopy(res, dst1);


    cvSetImageROI(res, rect2);
    cvCopy(res, dst2);


    cvSetImageROI(res, rect3);
    cvCopy(res, dst3);

    //取消设置
    cvResetImageROI(res);

    //显示图像
    cvShowImage("res", res);
    cvShowImage("dst", dst);

    cvShowImage("dst1", dst1);
    cvShowImage("dst2", dst2);
    cvShowImage("dst3", dst3);


    //需要提取图像ROI区域RGB的平均值,发现有一个cvAvg函数:
    //CvScalar cvAvg( const CvArr* arr, const CvArr* mask=NULL );  
    CvScalar avgChannels = cvAvg(dst);
    double avgB = avgChannels.val[0];
    double avgG = avgChannels.val[1];
    double avgR = avgChannels.val[2];//ROI 的均值

    CvScalar avgChannels1 = cvAvg(dst1);
    double avgB1 = avgChannels1.val[0];
    double avgG1 = avgChannels1.val[1];
    double avgR1 = avgChannels1.val[2];//ROI  1 的均值

    CvScalar avgChannels2 = cvAvg(dst2);
    double avgB2 = avgChannels2.val[0];
    double avgG2 = avgChannels2.val[1];
    double avgR2 = avgChannels2.val[2];//ROI  2 的均值

    CvScalar avgChannels3 = cvAvg(dst3);
    double avgB3 = avgChannels3.val[0];
    double avgG3 = avgChannels3.val[1];
    double avgR3 = avgChannels3.val[2];//ROI  3 的均值


    double ret = sqrt( pow((avgB - avgB2), 2) + pow((avgG - avgG2), 2) + pow((avgR - avgR2), 2));
    double ret1 = sqrt(pow((avgB1 - avgB2), 2) + pow((avgG1 - avgG2), 2) + pow((avgR1 - avgR2), 2));
    double ret2 = sqrt(pow((avgB - avgB3), 2) + pow((avgG - avgG3), 2) + pow((avgR - avgR3), 2));
    double ret3 = sqrt(pow((avgB1 - avgB3), 2) + pow((avgG1 - avgG3), 2) + pow((avgR1 - avgR3), 2));

    cout << "result :" << ret << endl;
    cout << "result1 :" << ret1 << endl;
    cout << "result2 :" << ret2 << endl;
    cout << "result3 :" << ret3 << endl;//控制台打印方差值
    
    //CV_BGR2HSV();

    cvWaitKey(0);

    cvDestroyWindow("res");
    cvDestroyWindow("dst");

    cvDestroyWindow("dst1");
    cvDestroyWindow("dst2");
    cvDestroyWindow("dst3");

    cvReleaseImage(&res);
    cvReleaseImage(&dst);

    cvReleaseImage(&dst1);
    cvReleaseImage(&dst2);
    cvReleaseImage(&dst3);
    
    return 0;

}

以上内容,自己手写,转载请注明出处!!谢谢!!

### ROI特征提方法及其实现 #### 基本概念 ROI(Region of Interest),即感兴趣区域,是指图像或数据集中需要重点关注的特定部分。在计算机视觉和医学影像领域,ROI通常用于减少计算负担并专注于关键信息。通过对ROI进行特征提,可以获得描述该区域的重要属性。 --- #### 特征提的主要方法 1. **统计特征** 统计特征是最常见的特征之一,它可以通过简单的数学运算来获。例如,均值方差、最大值、最小值等都可以用来描述ROI内的像素分布特性[^1]。 2. **纹理特征** 纹理特征反映了图像局部的空间关系。常用的技术包括灰度共生矩阵(GLCM)、LBP(Local Binary Patterns)以及傅里叶变换后的频谱分析。这些方法能够捕捉到ROI内部的细节变化[^3]。 3. **形状特征** 形状特征主要用于描述物体边界的信息。这可能涉及轮廓检测、周长计算、面积测量以及圆度评估等方面的内容。对于某些应用场景而言,比如肺部结节识别,这类特征尤为重要[^2]。 4. **频率域特征** 将时间/空间信号转换至频域后得到的新维度上的表现形式称为频率域特征。快速傅立叶变换(FFT)就是一种典型手段,它可以揭示隐藏于原始数据背后的周期性和趋势性规律[^4]。 5. **深度学习自动编码器** 利用卷积神经网络(Convolutional Neural Networks, CNNs)构建自监督学习模型来自动生成高层次语义表征向量作为最终输出结果;这种方法无需人工设计具体指标项而是让机器自行发现潜在联系从而达到更优效果。 --- #### 实现方式举例 以下是几种常见编程语言下的简单实现: ##### Python (使用 OpenCV 和 NumPy) ```python import cv2 import numpy as np def extract_statistical_features(image_roi): mean_val = np.mean(image_roi) std_deviation = np.std(image_roi) max_pixel = np.max(image_roi) min_pixel = np.min(image_roi) return { 'mean': mean_val, 'std_dev': std_deviation, 'max': max_pixel, 'min': min_pixel } # Example usage image = cv2.imread('example.jpg', 0) # Load grayscale image roi = image[100:200, 100:200] # Define a sample ROI features = extract_statistical_features(roi) print(features) ``` ##### MATLAB (基于 GLCM 的纹理分析) ```matlab I = imread('cameraman.tif'); grayImage = rgb2gray(I); glcm = graycomatrix(grayImage,'Offset',[2 0;0 2]); stats = graycoprops(glcm, {'Contrast','Correlation'}); disp(stats.Contrast); disp(stats.Correlation); ``` --- #### 应用案例 - 在医疗影像中,通过提肿瘤区域的大小、形态学参数可以帮助医生判断病情进展程度。 - 自动驾驶车辆感知模块会依据前方障碍物所在位置划定相应范围进而完成避障操作决策过程. ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值