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