C++ 图像中主亮度区域的自动检测

C++ 图像中主亮度区域的自动检测,c++,opencv,image-processing,C++,Opencv,Image Processing,我需要一些帮助来检测图像的主要强度区域。假设我有以下图像,并且我喜欢自动检测主要强度区域,并找到该主要区域的平均/平均强度值 这里,在图1中,主要强度区域为浅灰色区域,在图2中,主要强度区域为深灰色区域。如何检测这些图像中的主要区域并找到主要区域的平均强度值 图-1: 图2: 任何建议都会有帮助 更新:我使用以下代码获得Image-2的直方图。图3显示了直方图。现在,我需要找出哪个箱子保存了最多的值,即直方图的模式。但是,无法计算出如何使用大多数值计算bin 图3: int main(int,c

我需要一些帮助来检测图像的主要强度区域。假设我有以下图像,并且我喜欢自动检测主要强度区域,并找到该主要区域的平均/平均强度值

这里,在图1中,主要强度区域为浅灰色区域,在图2中,主要强度区域为深灰色区域。如何检测这些图像中的主要区域并找到主要区域的平均强度值

图-1: 图2:

任何建议都会有帮助

更新:我使用以下代码获得Image-2的直方图。图3显示了直方图。现在,我需要找出哪个箱子保存了最多的值,即直方图的模式。但是,无法计算出如何使用大多数值计算bin

图3:

int main(int,char**)
{
Mat gray=imread(“深度帧27/Image23.png”,0);
namedWindow(“灰色”,1);imshow(“灰色”,灰色);
//初始化参数
int histSize=256;//存储单元大小
浮动范围[]={0,255};
常量浮点*范围[]={range};
//计算直方图
成熟的历史;
calcHist(&gray,1,0,Mat(),hist,1,&histSize,ranges,true,false);
双最小值=0,最大值=0;
minMaxLoc(hist,&minVal,&maxVal,0,0);
//cout你想要的是强度直方图的模式(频率最高的箱子)。它直接告诉你平均强度

对于给定的图像,直方图由两个完全尖锐的峰值组成

在某些不好的情况下,主峰可能会分布在几个次峰上。在这种情况下,您需要在使用该模式之前对直方图进行平滑处理


查看第一个最大值和第二个最大值的相对高度,检查颜色的主导度可能会很有趣。

是否总是将强度进行二值化?如果不是,您可以尝试做一个直方图,找出哪个值的强度最大,并获得该值的位置。您还可以根据cl的数量选择箱子的数量你想要的驴(例如,2,你有上面的例子)。如果你还有问题,我可以稍后给你一个详细的答案:)@api55:基本上,我会先将图像转换为二进制。因为,我只关心主强度区域;图像区域的其余部分可以具有不同的强度。详细的答案肯定会有很大帮助:-)如何定义“主强度区域”?是左图中的整个浅灰色区域,还是仅矩形区域,而在暗灰色区域的右侧、顶部和底部没有周围?@Mika:是的,左图的主要强度区域是浅灰色区域(不包括暗矩形)。因为,与深灰色区域相比,此图像中有更多像素具有浅灰色强度值。而且,对于右侧图像,主要区域是深灰色区域;因为更多像素具有深灰色强度值。你有什么建议,如何在这些图像中检测主要强度区域?@Mika:是的,我将它们计算为它们属于优势强度区。谢谢你的建议。你能分享一些样本伪代码或opencv示例代码来实现这个想法吗?伪代码:-1.计算直方图-2.获得直方图模式。正是我评论的目的,这取决于你的优势强度的定义。例如ld是最高计数,或最高5…..对于历史计算,这是一个教程。然后你可以看到@YvesDaoust所说的峰值。然后从中决定要保留哪些箱子(最高或….)这就是你的优势color@YvesDaoust:我已经计算了柱状图。请参阅文章的“更新”部分。但是,无法确定如何找出哪个箱子保存了最多的值,即模式:-(@api55:谢谢你的详细反馈。我已经计算了直方图。请查看帖子的“更新”部分。但是,我无法找出哪个箱子保存了最多的值,即模式:-(
int main(int, char**)
{
    Mat gray=imread("Depth_frames_27/Image23.png",0);
    namedWindow( "Gray", 1 );    imshow( "Gray", gray );

    // Initialize parameters
    int histSize = 256;    // bin size
    float range[] = { 0, 255 };
    const float *ranges[] = { range };

    // Calculate histogram
    MatND hist;
    calcHist( &gray, 1, 0, Mat(), hist, 1, &histSize, ranges, true, false );

    double minVal=0, maxVal=0;
            minMaxLoc(hist, &minVal, &maxVal, 0, 0);
//    cout<<"Max:"<<maxVal<<endl;
//    cout<<"Min:"<<minVal<<endl;

    // Show the calculated histogram in command window
    double total;
    total = gray.rows * gray.cols;
    for( int h = 0; h < histSize; h++ )
         {
            float binVal = hist.at<float>(h);
            cout<<" "<<binVal;
         }

    // Plot the histogram
    int hist_w = 512; int hist_h = 400;
    int bin_w = cvRound( (double) hist_w/histSize );

    Mat histImage( hist_h, hist_w, CV_8UC1, Scalar( 0,0,0) );
    normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );

    for( int i = 1; i < histSize; i++ )
    {
      line( histImage, Point( bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1)) ) ,
                       Point( bin_w*(i), hist_h - cvRound(hist.at<float>(i)) ),
                       Scalar( 255, 0, 0), 2, 8, 0  );
    }

    namedWindow( "Result", 1 );    imshow( "Result", histImage );

    waitKey();
    return 0;
}
double minVal=0, maxVal=0; int minIdx, maxIdx;

    minMaxIdx(hist,&minVal,&maxVal, &minIdx, &maxIdx);
    cout<<"Max:"<<maxVal<<endl;


    cout<<"MaxIdx:"<<maxIdx<<endl;