pythonrandint函数左闭右开_【python】数字图像处理:高级形态学处理 阈值分割+闭运算+连通区域标记+删除小区块+分色显示...

46fee8c92370bee901f6296d77fc0a13655ac1b9.jpg

了解形态学基本处理的同学都知道,开运算和闭运算就是将腐蚀和膨胀按照一定的次序进行处理。b. 膨胀 连通被噪声、阴影分割的区域。图像进行膨胀处理和腐蚀处理之后,可以去掉很小的噪点。

1、凸包

凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含在内。

函数为:

skimage.morphology.convex_hull_image(image)

输入为二值图像,输出一个逻辑二值图像。在凸包内的点为True, 否则为False

例:

import matplotlib.pyplot as plt

from skimage import data,color,morphology #生成二值测试图像 img=color.rgb2gray(data.horse()) img=(img<0.5)*1 chull = morphology.convex_hull_image(img) #绘制轮廓 fig, axes = plt.subplots(1,2,figsize=(8,8)) ax0, ax1= axes.ravel() ax0.imshow(img,plt.cm.gray) ax0.set_title('original image') ax1.imshow(chull,plt.cm.gray) ax1.set_title('convex_hull image')

Jvyyei.png

334e4f1157154745b51d811c9de1b54f.jpg

convex_hull_image()是将图片中的所有目标看作一个整体,因此计算出来只有一个最小凸多边形。如果图中有多个目标物体,每一个物体需要计算一个最小凸多边形,则需要使用convex_hull_object()函数。

函数格式:skimage.morphology.convex_hull_object(image,neiors=8)

输入参数image是一个二值图像,neiors表示是采用4连通还是8连通,默认为8连通。

例:

import matplotlib.pyplot as plt

from skimage import data,color,morphology,feature #生成二值测试图像 img=color.rgb2gray(data.coins()) #检测canny边缘,得到二值图片 edgs=feature.canny(img, sigma=3, low_threshold=10, high_threshold=50) chull = morphology.convex_hull_object(edgs) #绘制轮廓 fig, axes = plt.subplots(1,2,figsize=(8,8)) ax0, ax1= axes.ravel() ax0.imshow(edgs,plt.cm.gray) ax0.set_title('many objects') ax1.imshow(chull,plt.cm.gray) ax1.set_title('convex_hull image') plt.show()

ZN3m2m.png

2、连通区域标记

在二值图像中,如果两个像素点相邻且值相同(同为0或同为1),那么就认为这两个像素点在一个相互连通的区域内。而同一个连通区域的所有像素点,都用同一个数值来进行标记,这个过程就叫连通区域标记。在判断两个像素是否相邻时,我们通常采用4连通或8连通判断。在图像中python 图像区域分割,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有2种:4邻接与8邻接。4邻接一共4个点,即上下左右,如下左图所示。8邻接的点一共有8个,包括了对角线位置的点,如下右图所示。

6NBV7b.png

111245361367310.png

在skimage包中,我们采用measure子模块下的label()函数来实现连通区域标记。

函数格式:

skimage.measure.label(image,connectivity=None)

参数中的image表示需要处理的二值图像,connectivity表示连接的模式,1代表4邻接,2代表8邻接。

输出一个标记数组(labels), 从0开始标记。

import numpy as np

import scipy.ndimage as ndi

from skimage import measure,color

import matplotlib.pyplot as plt

#编写一个函数来生成原始二值图像

def microstructure(l=256):

n = 5

x, y = np.ogrid[0:l, 0:l] #生成网络

mask = np.zeros((l, l))

generator = np.random.RandomState(1) #随机数

points = l * generator.rand(2, n**2)

mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1

mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯滤波

return mask > mask.mean()

data = microstructure(l=128)*1 #生成测试图片

labels=measure.label(data,connectivity=2) #8连通区域标记

dst=color.label2rgb(labels) #根据不同的标记显示不同的颜色

print('regions number:',labels.max()+1) #显示连通区域块数(从0开始标记)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

ax1.imshow(data, plt.cm.gray, interpolation='nearest')

ax1.axis('off')

ax2.imshow(dst,interpolation='nearest')

ax2.axis('off')

fig.tight_layout()

plt.show()

在代码中,有些地方乘以1,则可以将bool数组快速地转换为int数组。

结果如图:有10个连通的区域,标记为0-9

7j6ZBn.png

b19fa737398762810186037d8126713225fe4f.jpg

如果想分别对每一个连通区域进行操作,比如计算面积、外接矩形、凸包面积等,则需要调用measure子模块的regionprops()函数。该函数格式为:

skimage.measure.regionprops(label_image)

返回所有连通区块的属性列表,常用的属性列表如下表:

第一种算法是在确定二值图像边界的围绕关系,即确定接而成,并构成不同数目边的面积。不管怎样,我们现在获得了目标的轮廓,并且在第17 行返回包含(x, y)坐标和像素高度和宽度信息的边界框给调用函数。

3、删除小块区域

ethereal由于采用插件技术,一个新加入开发的程序员开发一种新的协议分析模块的时候不需要了解所有的代码,他只需要写好这个协议模块的函数后,写一个格式为proto_reg_handoff_xxx的函数,在函数内调用注册函数告诉系统在什么时候需要调用这个协议模块。剪贴板消息处理函数onaskcbformatname当剪贴板的拥有者将显示剪贴板内容时,剪贴板观察程序就调用这个函数onchangecbchain通知指定的窗口将从链中删除ondestroyclipboard当通过windows的emptyclipboard函数清空剪贴板时调用这个函数ondrawclipboard当内容变化时调用这个函数onhscrollclipboard当剪贴板的拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数onpaintclipboard当剪贴板观察器的客户区需要重画的时候调用这个函数onrenderallformats当拥有者应用程序将被销毁且需要提交它的所有格式时调用这个函数onrenderformat当一种延迟提交的格式需要被提交时为剪贴板拥有者调用这个函数onsizeclipboard当剪贴板观察器窗口的客户区大小发生变化时调用这个函数onvscrollclipboard当拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数。3.2系统模块流程图nynynynynyy图3.1系统模块流程图3.3主要模块的流程图(1)输出函数流程图(如图3.2)ny图3.2. 输出函数流程图(2)插入函数流程图(如图3.3)ny图3.3插入函数流程图(3)删除函数流程图(如图3.4)nynyn ny图3.4删除函数流程图(4)创建单链表函数流程图(如图3.5)nynys->next=p。

函数格式:skimage.morphology.remove_small_objects(ar,min_size=64,connectivity=1,in_place=False)

参数:

ar: 待操作的bool型数组。

20180614233301089132.png

min_size: 最小连通区域尺寸,小于该尺寸的都将被删除。默认为64.

connectivity: 邻接模式,1表示4邻接,2表示8邻接

in_place: bool型值,如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False.

返回删除了小块区域的二值图像。

import numpy as np

import scipy.ndimage as ndi

from skimage import morphology

import matplotlib.pyplot as plt

#编写一个函数来生成原始二值图像

def microstructure(l=256):

n = 5

x, y = np.ogrid[0:l, 0:l] #生成网络

mask = np.zeros((l, l))

generator = np.random.RandomState(1) #随机数

points = l * generator.rand(2, n**2)

mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1

mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯滤波

return mask > mask.mean()

data = microstructure(l=128) #生成测试图片

dst=morphology.remove_small_objects(data,min_size=300,connectivity=1)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

ax1.imshow(data, plt.cm.gray, interpolation='nearest')

ax2.imshow(dst,plt.cm.gray,interpolation='nearest')

fig.tight_layout()

plt.show()

在此例中,我们将面积小于300的小块区域删除(由1变为0),结果如下图:

BzYVja.png

4、综合示例:阈值分割+闭运算+连通区域标记+删除小区块+分色显示

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.patches as mpatches

from skimage import data,filter,segmentation,measure,morphology,color

#加载并裁剪图片

image = data.coins()[50:-50, 50:-50]

thresh =filter.threshold_otsu(image) #阈值分割

bw =morphology.closing(image > thresh, morphology.square(3)) #闭运算

cleared = bw.copy() #复制

segmentation.clear_border(cleared) #清除与边界相连的目标物

label_image =measure.label(cleared) #连通区域标记

borders = np.logical_xor(bw, cleared) #异或

label_image[borders] = -1

image_label_overlay =color.label2rgb(label_image, image=image) #不同标记用不同颜色显示

fig,(ax0,ax1)= plt.subplots(1,2, figsize=(8, 6))

ax0.imshow(cleared,plt.cm.gray)

ax1.imshow(image_label_overlay)

for region in measure.regionprops(label_image): #循环得到每一个连通区域属性集

#忽略小区域

if region.area < 100:

continue

#绘制外包矩形

minr, minc, maxr, maxc = region.bbox

rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,

fill=False, edgecolor='red', linewidth=2)

ax1.add_patch(rect)

fig.tight_layout()

plt.show()

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-117090-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值