万壑松风知客来,摇扇抚琴待留声
1. 文起
纪念刚过的 1024。
图像投影和分割在图像处理中也是一种常见的处理方式,通过某种途径对一种图像中的物体进行区分,本文将记录一种十分简单却十分有效的投影、分割方法。
其实这个投影十分的容易理解,简单来说就是将图像中的像素点投影到图像的边缘。同时还可以按照某种条件对其进行分割,从而得到其中一部分的图像信息。分割的话就是根据物体间隙横纵切割。下面具体来说说。
2. 垂直方向
2.1. 垂直投影图像

以上是一张原图,其中包含了三个形状,每个形状之间都有一定的空隙,先来看看投影的步骤。
1 | import numpy as np |

1 | # 获得图像的高、宽 |

上图就是垂直向上投影的结果,和想象中还是差不多的。
2.2. 垂直分割图像
前面我们提过,还需要将图像进行划分,得到相对独立的个体。从上面可以看出,每个形状之间其实是有空隙的,那么这就将作为我们分割的条件。
1 | # 记录分割起点、末点 |



以上三个图形就是通过物体之间间隙的条件进行划分的结果,可以明显看到十分准确。
3. 水平方向
3.1. 水平投影图像
既然有垂直投影,当然就会有水平投影。如果我们将上面的原图转换一下,那垂直投影就不再适用了。
1 | # 读取原图 |

面对这样的图像,下意识就能想到不论是投影还是分割,都将从垂直转换为水平方向。其实水平处理和垂直处理相差无异,区别只是某些参数的使用。
1 | image_90 = cv2.imread(r'./2.png', flags=0) |

将原来的图像水平向左投影后的结果如上图。
3.2. 水平分割图像
1 | split_start = None |



到此完成了垂直和水平方向上投影、分割的功能。
4. 封装
其实可以看到垂直、水平处理其实几乎差不多,所以为了减小代码的冗余,我们对其进行简单封装处理。
1 | import numpy as np |
这是简单的函数封装,如果有时间可以封装成类,并且解决其中的很多问题。
如果使用该封装,你需要注意 projection、split 两个函数传入的 direction 函数必须相同,否则 where_id 就会对应错误。
5. 文末
对于图像处理,以上的投影和分割只是很小的一部分。不过在实际的使用中,其实可以在以上的步骤中添加更多的方法合理组合使用以应对不同场景。