【求助】图像处理(霍夫变换)新问题,谢谢大家。

clkz01 2013-04-02 02:18:17
这几天已经在研究opencv中的霍夫变换,目的就是求助中心,现在已经可以算出中心了,可是图像如果是这样,中心边可求出,如下:

这种图就可以求助那个亮十字的中心。

可是这种图就求不出亮十字中心了,如下图:

已经用红色的框框出来了,用霍夫变换处理图片,如下图:

没有得到那个十字的断点,所以线也没有画出来,中心也无法求出。

cvCanny( src, dst, 10, 80,3);//主要是更改这个的参数,怎么改都求不出那条线的端点。

比如这种图像,用霍夫变换能求出来吗?还是方法不对,有没有更好的办法呢?谢谢大家了。
...全文
391 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjgdwyt 2013-07-24
  • 打赏
  • 举报
回复
请问楼主最后选择了什么方法?我现在用OPENCV也遇到了和你类似的问题
clkz01 2013-04-09
  • 打赏
  • 举报
回复
引用 8 楼 NexTor 的回复:
cvCanny的两个参数的意思是如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃,那么如果该店的梯度位于两者之间呢?则当其与高于上限值的像素点连接时我们才保留,否则删除。 所以如果你的影子十字不是很明显的话,你的第二个阈值貌似真不能设的太大,不然就会给删去了。做完cvCanny后你可以做点去噪等后处理,然后再用霍夫变换。 或是直接用cvCa……
经过测试和分析,这个方法通用性不高,图像比较好的情况下才能很好的使用。用在这个上面不行,因为有时候图像很差基本分辨不出来,目前看只有放弃这种方法,还是要谢谢各位朋友的解答!尤其要谢谢NexTor!
NexTor 2013-04-03
  • 打赏
  • 举报
回复
cvCanny的两个参数的意思是如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃,那么如果该店的梯度位于两者之间呢?则当其与高于上限值的像素点连接时我们才保留,否则删除。 所以如果你的影子十字不是很明显的话,你的第二个阈值貌似真不能设的太大,不然就会给删去了。做完cvCanny后你可以做点去噪等后处理,然后再用霍夫变换。 或是直接用cvCanny大的阈值先确定出一个十字后,把这个十字的那个区域全用背景色填充了,为防止影响可能稍微填充的区域大一些,然后再对处理后图像做一次cvCanny,这回的阈值设得小一些,把第二个十字找出来,我不知道效果怎么样,你可以试试
clkz01 2013-04-03
  • 打赏
  • 举报
回复
引用 6 楼 NexTor 的回复:
引用 5 楼 clkz01 的回复:引用 4 楼 NexTor 的回复:我想你是不是可以先检测出两个十字,然后根据前景十字的位置信息来区别是十字还是它的影子十字。
用霍夫算法应该能比较容易检测出其中最明显的一个十字吧,然后把检测到的第一个十字区域的用背景色填充后再做一次霍夫检测去检测出另外的一个十字呗,看你的图,前景的十字貌似都是在中间位置吧,不知道是不是固定的可以用中……


首席谢谢你的回答,我也纳闷,为什么另外的一个十字就检测不到,感觉和另外一个十字的亮度有关,或者十字完整度有关,只要能用霍夫算法能检测都链两个十字,接下来的事情就容易了。
你看这个部分代码如下:
 
cvCanny( src, dst, 0, 32, 3 );//我主要调整这个 0,32,设置成50,100后只保留中心十字了,后面那个十字没有了。
cvCvtColor( dst, color_dst, CV_GRAY2BGR );
#if 1
lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 );

for( i = 0; i < MIN(lines->total,100); i++ )
{
float* line = (float*)cvGetSeqElem(lines,i);
float rho = line[0];
float theta = line[1];
CvPoint pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 1, CV_AA, 0 );
}


不会是代码有误,还是。。。。
NexTor 2013-04-03
  • 打赏
  • 举报
回复
引用 5 楼 clkz01 的回复:
引用 4 楼 NexTor 的回复:我想你是不是可以先检测出两个十字,然后根据前景十字的位置信息来区别是十字还是它的影子十字。 用霍夫算法应该能比较容易检测出其中最明显的一个十字吧,然后把检测到的第一个十字区域的用背景色填充后再做一次霍夫检测去检测出另外的一个十字呗,看你的图,前景的十字貌似都是在中间位置吧,不知道是不是固定的可以用中心位置的信息来定位是十字还是影子吧。……
如果我做的话,我可能先对图像进行边缘处理,然后根据霍夫算法求得最长的横的2条平行线和竖的2条平行线(应该是属于同一个十字的横竖线),确定平行线的时候可能稍微判断一下平行线间的距离,如果太大的间距的话可能是2个十字各自的横线。这就能确定出一个十字了,然后把这个十字的区域的边缘像素都抹去,这样应该就剩下另一个十字的边缘线了吧,再同上面的霍夫检测,测2横2竖线,应该能确定另一个十字吧。 我不知道你为什么用霍夫检测不出另一个十字,是因为边缘检测后无法得到2个十字的边缘吗,我看你贴的图貌似2个十字的边缘线还是挺明显的嘛
clkz01 2013-04-03
  • 打赏
  • 举报
回复
引用 4 楼 NexTor 的回复:
我想你是不是可以先检测出两个十字,然后根据前景十字的位置信息来区别是十字还是它的影子十字。 用霍夫算法应该能比较容易检测出其中最明显的一个十字吧,然后把检测到的第一个十字区域的用背景色填充后再做一次霍夫检测去检测出另外的一个十字呗,看你的图,前景的十字貌似都是在中间位置吧,不知道是不是固定的可以用中心位置的信息来定位是十字还是影子吧。或是用两个十字的灰度值,面积等特征来……
1.扫描对整幅图,图像中的灰度值都记录下来,中心位置的十字丝是固定的,所以区域就知道了。另外出现的灰度值,如果是连续的就判定是一个十字,如果是不完整的十字,如何确定十字中心位置呢?有的十字亮有的十字暗也可以用这个方法来判断? 2.我是用霍夫算法来做,明显的十字就能检测出来,你的方法就是把固定中心规定区域的十字填充为背景色(黑色),然后再用霍夫算法来检测一遍,可是那个十字不完整可否检测的出来呢?我用PS把图片中心位置用是十字丝处理为背景,可是另外一个十字无法用霍夫算法检测出来。该如何办比较好呢?不管怎么做,都要先把中心十字处理一下,比如填充为黑色在做接下来的工作吧。
NexTor 2013-04-02
  • 打赏
  • 举报
回复
我想你是不是可以先检测出两个十字,然后根据前景十字的位置信息来区别是十字还是它的影子十字。 用霍夫算法应该能比较容易检测出其中最明显的一个十字吧,然后把检测到的第一个十字区域的用背景色填充后再做一次霍夫检测去检测出另外的一个十字呗,看你的图,前景的十字貌似都是在中间位置吧,不知道是不是固定的可以用中心位置的信息来定位是十字还是影子吧。或是用两个十字的灰度值,面积等特征来区别前景和影子。
libralibra 2013-04-02
  • 打赏
  • 举报
回复
你的红线没有检测到背景十字啊, 根据你求出来的直线的解析式,联立方程就可以求得交点了吧
clkz01 2013-04-02
  • 打赏
  • 举报
回复
刚才单独对图像进行处理了,锐化等操作,可是效果不明显。还是检查不到那个十字(中心十字除外)。
excelle_ICT 2013-04-02
  • 打赏
  • 举报
回复
外行来嚷一句:背景那种十字,应该是要去噪之后才检测吧。比如锐化一下~

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧