011:利用大津算法完成图片分割

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。

合集完整版请参考这里

上一篇文章介绍了大津算法可以完成图片的前景和背景分割。

总的来说,大津算法的核心思想就两个:

数学上,通过确定一个像素阈值,来将图片中的像素分为两类,一类前景、一类背景,然后计算两类图像的类间方差,使方差最大。工程实现上,为了确定像素阈值,采用遍历的方法来实现。

图像分割实战

下面通过一个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通道的概念,对后面理解通道间特征融合会更有帮助。

后面开始进入深度学习部分,开始的几篇文章也会从基础知识讲起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值