寻找局部最大值灰度图像opencv
Posted
技术标签:
【中文标题】寻找局部最大值灰度图像opencv【英文标题】:Finding Local Maxima Grayscale Image opencv 【发布时间】:2013-02-28 19:57:04 【问题描述】:我正在尝试创建我的个人 Blob 检测算法
据我所知,我首先必须创建具有不同 sigma 的不同高斯内核(我正在使用 Mat kernel= getGaussianKernel(x,y);
)然后获取该内核的拉普拉斯算子,然后用它过滤图像,以便创建我的尺度空间。现在我需要在尺度空间的每个结果图像中找到局部最大值。但我似乎找不到合适的方法来做到这一点......到目前为止我的代码是
vector <Point> GetLocalMaxima(const cv::Mat Src,int MatchingSize, int Threshold)
vector <Point> vMaxLoc(0);
if ((MatchingSize % 2 == 0) ) // MatchingSize has to be "odd" and > 0
return vMaxLoc;
vMaxLoc.reserve(100); // Reserve place for fast access
Mat ProcessImg = Src.clone();
int W = Src.cols;
int H = Src.rows;
int SearchWidth = W - MatchingSize;
int SearchHeight = H - MatchingSize;
int MatchingSquareCenter = MatchingSize/2;
uchar* pProcess = (uchar *) ProcessImg.data; // The pointer to image Data
int Shift = MatchingSquareCenter * ( W + 1);
int k = 0;
for(int y=0; y < SearchHeight; ++y)
int m = k + Shift;
for(int x=0;x < SearchWidth ; ++x)
if (pProcess[m++] >= Threshold)
Point LocMax;
Mat mROI(ProcessImg, Rect(x,y,MatchingSize,MatchingSize));
minMaxLoc(mROI,NULL,NULL,NULL,&LocMax);
if (LocMax.x == MatchingSquareCenter && LocMax.y == MatchingSquareCenter)
vMaxLoc.push_back(Point( x+LocMax.x,y + LocMax.y ));
// imshow("W1",mROI);cvWaitKey(0); //For gebug
k += W;
return vMaxLoc;
我在this 线程中找到了它,它应该返回最大值所在的点向量。它确实返回了一个点向量,但每个点的所有 x 和 y 坐标始终为 -17891602 ......怎么办??? 如果您要带领我做一些其他事情而不是更正我的代码,请提供信息,因为我对 opencv 一无所知。我只是在学习
【问题讨论】:
请注意,当 pProcess 之前没有被触发时,此代码不会给出图像底部和右侧边缘的点的结果:此代码不可靠! 【参考方案1】:这里的问题是您的 LocMax 点是在内部循环中声明的并且从未初始化,因此它每次都返回垃圾数据。如果您回头查看*** question you linked,您会看到它们相似的变量Point maxLoc(0,0)
在顶部声明并构造为指向搜索窗口的中间。它只需要初始化一次。随后的循环迭代将用minMaxLoc
函数结果替换该值。
总之,在你的内部循环中删除这一行:
Point LocMax; // delete this
并在顶部附近添加一个略有改动的版本:
vector <Point> vMaxLoc(0); // This was your original first line
Point LocMax(0,0); // your new second line
无论如何,这应该让你开始。
【讨论】:
仍然得到相同的 x 和 y,我是否发送了错误的匹配距离? 我真的以为可以做到。我认为你应该设置一个断点并跟踪你的记忆。如果你的向量返回长度为 0 是一回事,但如果它有一个具有唯一内存地址的点列表,那么这些点会在某处定义(或至少分配)然后被删除。 就是这样,它没有唯一值,它们都是一样的 对,数值都是一样的。内存地址呢?是否至少分配了新的 Point 对象? 不知道怎么查,也没时间【参考方案2】:我找到了伙计们。问题是我的门槛太高了。我不明白为什么它给了我负分而不是零分,但降低门槛却奏效了
【讨论】:
以上是关于寻找局部最大值灰度图像opencv的主要内容,如果未能解决你的问题,请参考以下文章
opencv中16位的矩阵保存成图像,最大灰度值只有32768
深度学习和目标检测系列教程 20-300:OpenCV与图像处理:霍夫变换技术实现直线检测
深度学习和目标检测系列教程 20-300:OpenCV与图像处理:霍夫变换技术实现直线检测