返回信息流这个问题困扰我很久了,就是在访问一张图像的时候,怎么才能快速的处理图像的边缘像素,减少判断次数。
比如,我想用一个算子卷积整个图像,最白痴的方法就是,每次卷积的时候,都要判断一下该像素是不是边缘像素,如果是的话,要进行特殊处理(因为卷积核可能有一部分滑动到图像外面了),如果不是,那就照常运算。
这种情况下,如果图像大小是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)小吗?
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #9716同步于 2012/11/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
问个图像处理的问题
handspeaker
2012/11/23镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
我一般都是区分来做处理。区域增长需要充足的内存,限定的话还没想好怎么弄。
【 在 handspeaker (bear‘s CC|7ger) 的大作中提到: 】
: 这个问题困扰我很久了,就是在访问一张图像的时候,怎么才能快速的处理图像的边缘像素,减少判断次数。
: 比如,我想用一个算子卷积整个图像,最白痴的方法就是,每次卷积的时候,都要判断一下该像素是不是边缘像素,如果是的话,要进行特殊处理(因为卷积核可能有一部分滑动到图像外面了),如果不是,那就照常运算。
: 这种情况下,如果图像大小是m*n,需要做O(m*n)次判断,不需要开辟新的空间。以下的时间复杂度是对于判断次数来讲的,如果对于整个的图像处理过程,那肯定是O(m*n) ,不会有变化。
: ...................
多谢回复,区域增长的话按广度优先遍历可以只需要额外O(m+n)的空间(利用循环队列),不过判断次数太多比较麻烦,我还没太想好,目前我写的比opencv还是要慢一些的,感觉很多图像处理算法其实蕴含着复杂的计算机算法,我再想想……
【 在 AMY1990 的大作中提到: 】
: 我一般都是区分来做处理。区域增长需要充足的内存,限定的话还没想好怎么弄。
: