python-opencv图像分割

文章目录

二值化

所谓图像分割,就是将图像的目标和背景分离开来,更直观一点,就是把目标涂成白色,背景涂成黑色,言尽于此,是不是恍然大悟:这不就是二值化么?

【threshold]是此前提到的二值化函数,但只讲解了固定阈值分割模式,而并未讲解其自动分割的OTSU模式。

【adaptiveThreshold】是opencv提供的自适应阈值函数,可根据不同的卷积核来对局部进行二值化,可以更加细致地得到物体边缘。

OTSU算法,mean核,高斯核的分割结果如下图所示,其中150是手动设置的分割阈值;100是OTSU自动计算出的分割阈值。

提示说图像违规,也不知道哪违规了。

代码如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2

path = ‘coins.jpg’

coins = { }
coins[“original”] = plt.imread(path)
coins[“gray”] = cv2.cvtColor(coins[“original”],cv2.COLOR_RGB2GRAY)

_, coins[‘th150’] = cv2.threshold(coins[“gray”], 150, 255,
cv2.THRESH_BINARY)
th, bImg = cv2.threshold(coins[“gray”], 0, 255,
cv2.THRESH_BINARY+cv2.THRESH_OTSU)
coins[f’otsu({ th})'] = bImg

method = { “mean”:cv2.ADAPTIVE_THRESH_MEAN_C,
“gaussian”:cv2.ADAPTIVE_THRESH_GAUSSIAN_C}
for key in method:
coins[key] = cv2.adaptiveThreshold(coins[“gray”], 255,
method[key], cv2.THRESH_BINARY, 11, 2)

for i,key in enumerate(coins,1):
plt.subplot(2,3,i)
plt.imshow(coins[key], cmap=‘gray’)
plt.title(key)
plt.axis(‘off’)

plt.show()

图像骨骼

如果把二值图像理解成地形,黑色表示海洋,白色表示陆地,那么陆地上任意一点,到海洋都有一个最近的距离,如下图所示。由于硬币图案的颜色并不完全一致,所以在二值化时可能会出现不一致的情况,为此,需要通过腐蚀或者膨胀等形态学处理,将其内部涂抹均匀,从而得到一张目标与背景完全分割的图像,此即【dilate】图。对dilate图而言,【dist-bg】为其黑色区域的骨骼;【dist-fg】为白色区域的骨骼。

在这里插入图片描述

实现代码如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2

bImg = coins[f’otsu({ th})']

kernel = np.ones((5,5),np.uint8)
coins[“dilate”] = cv2.dilate(coins[f’otsu({ th})'], kernel)
coins[“dist-fg”] = cv2.distanceTransform(
coins[“dilate”], cv2.DIST_L2,5)
coins[“dist-bg”] = cv2.distanceTransform(
255-coins[“dilate”], cv2.DIST_L2,5)

keys = [‘dilate’, ‘dist-bg’, ‘dist-fg’]
for i,key in enumerate(keys,1):
plt.subplot(1,3,i)
plt.imshow(coins[key], cmap=‘gray’)
plt.title(key)
plt.axis(‘off’)

plt.show()

【distanceTransform】函数的功能是,计算当前像素点到零像素点的最短距离,其输入参数有三,分别是输入的二值图像;求解距离的类型,以及掩膜尺寸,一般可设为3或者5。

在一张图像中,两点之间的距离有多种计算方式,比如

  • a a a 水平和数竖直方向的变化量
  • b b b 对角方向的变化量
  • c c c 条约移动的变化量

距离变换函数综合了这三种距离,根据各种距离的权重不同,提供了下面几种不同的距离类别

distanceTypemaskSize参数
CV_DIST_C3 ( 3 × 3 ) (3×3) (3×3) a = 1 , b = 1 a=1,b=1 a=1,b=1
CV_DIST_L13 ( 3 × 3 ) (3×3) (3×3) a = 1 , b = 2 a=1,b=2 a=1,b=2
CV_DIST_L23 ( 3 × 3 ) (3×3) (3×3)

for i,key in enumerate([‘dilate’, ‘labels’],1):
plt.subplot(1,3,i)
plt.imshow(coins[key], cmap=‘gray’)
plt.title(key)
plt.axis(‘off’)

ax = plt.subplot(133, projection=‘3d’)
ys, xs = np.indices(coins[‘labels’].shape)
ax.plot_surface(xs, ys, coins[‘labels’])
plt.title(“labels”)
plt.show()

【connectedComponents】是opencv提供的连通域分割函数,其必不可少的输入参数是一个二值图像,此外还有两个整型参数,分别用于规定邻域形式和输出的Labels类型。其中,邻域形式主要分为4-邻域和8邻域,前者把当前像素的上下左右四个像素算作邻域,换言之,这四个像素与当前像素是连通的;8-邻域则将一个像素周围的8个像素视作邻域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值