BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #9716同步于 2012/11/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

问个图像处理的问题

handspeaker
2012/11/23镜像同步2 回复
这个问题困扰我很久了,就是在访问一张图像的时候,怎么才能快速的处理图像的边缘像素,减少判断次数。 比如,我想用一个算子卷积整个图像,最白痴的方法就是,每次卷积的时候,都要判断一下该像素是不是边缘像素,如果是的话,要进行特殊处理(因为卷积核可能有一部分滑动到图像外面了),如果不是,那就照常运算。 这种情况下,如果图像大小是m*n,需要做O(m*n)次判断,不需要开辟新的空间。以下的时间复杂度是对于判断次数来讲的,如果对于整个的图像处理过程,那肯定是O(m*n) ,不会有变化。 时间复杂度:O(m*n) 空间复杂度:O(1) 改进1: 图像扩大 例如,算子是3*3,那么可以将图像扩大到(m+2)*(n+2),也就是说上下左右各增加一个像素的宽带,并且根据不同的方法的需要,把整个‘新的边缘’进行赋值。这样一来,再逐个 像素进行访问的时候,就不需要进行判断了。但是,图像的扩大需要新申请一块(m+2)*(n+2)的空间。 时间复杂度:O(1) 空间复杂度:O(m*n) 改进2: 分别处理 把像素分成两种,一种是边缘像素,一种是非边缘像素,对于非边缘像素,自然不需要进行判断。仅对于边缘像素判断其属于哪个边即可。这种方法涉及判断的像素只是四条边上的,而且不需要额外开辟新的空间。 时间复杂度:O(m+n) 空间复杂度:O(1) 我的问题: 以上两种改进算法都是对于滑动窗口这类操作适用的,而且内存也比较充足,但是像区域生长这种算法(给定一个种子点,给定一个像素值差,然后把包含种子点的最大连通区域找到),如何能减少判断的次数呢?另外,不允许再开辟额外的内存空间,即空间复杂度是O(1),那么,时间复杂度可以比O(m*n)小吗?
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
AMY1990机器人#1 · 2012/11/27
我一般都是区分来做处理。区域增长需要充足的内存,限定的话还没想好怎么弄。 【 在 handspeaker (bear‘s CC|7ger) 的大作中提到: 】 : 这个问题困扰我很久了,就是在访问一张图像的时候,怎么才能快速的处理图像的边缘像素,减少判断次数。 : 比如,我想用一个算子卷积整个图像,最白痴的方法就是,每次卷积的时候,都要判断一下该像素是不是边缘像素,如果是的话,要进行特殊处理(因为卷积核可能有一部分滑动到图像外面了),如果不是,那就照常运算。 : 这种情况下,如果图像大小是m*n,需要做O(m*n)次判断,不需要开辟新的空间。以下的时间复杂度是对于判断次数来讲的,如果对于整个的图像处理过程,那肯定是O(m*n) ,不会有变化。 : ...................
handspeaker机器人#2 · 2012/11/27
多谢回复,区域增长的话按广度优先遍历可以只需要额外O(m+n)的空间(利用循环队列),不过判断次数太多比较麻烦,我还没太想好,目前我写的比opencv还是要慢一些的,感觉很多图像处理算法其实蕴含着复杂的计算机算法,我再想想…… 【 在 AMY1990 的大作中提到: 】 : 我一般都是区分来做处理。区域增长需要充足的内存,限定的话还没想好怎么弄。 :