本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。
合集完整版请参考这里。
上一篇文章介绍了大津算法可以完成图片的前景和背景分割。
总的来说,大津算法的核心思想就两个:
数学上,通过确定一个像素阈值,来将图片中的像素分为两类,一类前景、一类背景,然后计算两类图像的类间方差,使方差最大。工程实现上,为了确定像素阈值,采用遍历的方法来实现。
图像分割实战
下面通过一个python代码,利用大津算法来实现对一张图片的分割。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('luna.jfif', cv2.IMREAD_GRAYSCALE)
# 大津算法找到最佳阈值
_, thresholded = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 使用 Matplotlib 显示原始图像和分割结果
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(thresholded, cmap='gray')
plt.title('Segmented Image'), plt.xticks([]), plt.yticks([])
plt.show()
我选取了下面这张在图像处理领域很流行的图片来做测试,这种图片之所有有名,是因为图像中含有丰富的细节、纹理、颜色等信息,方便做多种测试。
这位女士名叫 Lena。
电气电子工程师学会图像处理汇刊 (IEEE Transactions on Image Processing)主编曾在1996年1月出版的一期中解释道,Lena的流行,因为她是一张好的测试图片,其中包含了很多细节,平滑区域,阴影和纹理。
利用上述代码对该图像进行前景和背景的分离后,可得到以下的效果:
在上面这个例子的代码中,cv2.THRESH_OTSU 告诉 OpenCV 使用大津算法来选择阈值。thresholded 变量为分割后的黑白图像:其中前景被设为白色(255),背景被设为黑色(0)。
如之前所说,大津算法假定图像中只有两个主要的类别,即前景和背景。
如果图像有更复杂的结构,或者希望将图像分为更多个类别,此时大津算法便不再适用。需要用其他的图像分割算法来完成,这里就不展开了。
下一模块进入基于深度学习的计算机视觉
本专栏传统的计算机视觉部分到这里。
之所以本专栏的前面几篇文章会介绍传统计算机视觉的一些算法,并进行了一些代码实战,有两个原因:
第一:传统CV中的经典算法和基于深度学习的CV中的很多算法有异曲同工之妙。比如滤波算法中的滤波器(也叫核函数),与后面要着重介绍的卷积算法、池化算法非常类似。先行了解传统CV的算法有助于后面的学习。
第二:不论是传统CV还是基于深度学习的CV, 不论是那种算法,基于图像的处理都离不开像素的局部性运算(乘累加为典型)和通道间的特征融合(卷积、矩阵乘、全连接为典型)。先了解了传统CV中RGB通道的概念,对后面理解通道间特征融合会更有帮助。
后面开始进入深度学习部分,开始的几篇文章也会从基础知识讲起。