基于遗传算法的Ostu法在图像分割中的应用

像素关系
相邻像素
       位于坐标(x,y)处的像素P有4个水平和垂直的相邻像素,其坐标为:

(x+1,y),(x-1,y),(x,y+1),(x,y-1)

这组相邻元素称为P的4邻域。用N4(P)表示。类似于十字形。

P的4个对角相邻像素坐标如下:

(x+1,y+1),(x+1,y-1),(x-1,y+1),(x-1,y+1)

用ND(P)表示。这些点与N4(P)的4个点一起称为P的8邻域,用N8(P)表示。

邻接,连通,区域和边界

V是定义邻接性的灰度值集合。在二值图像中,如果把具有1值的像素归诸于邻接像素,则V={1}。共定义三种形式的邻接:

A.4邻接。如果q在集合N4(p)中,则具有V中数值的两个像素p和q是4邻接的。

B.8邻接。如果q在集合N8(p)中,则具有V中数值的两个像素p和q是8邻接的。

C.m邻接(混合邻接)。如果q在集合N4(p)中,或q在ND(p)中,且集合N4(p)∩N4(q)中没有来自V中数值的像素,则具有V中数值的两个像素p和q是m邻接的。(m邻接的引进是为了消除8邻接时产生的二义性)

从坐标为(x,y)的p像素点到坐标为(s,t)的q像素点的通路是特定的像素序列,其坐标序列为(x0,y0),(x1,y1),(x2,y2),...,(xn,yn)。其中(x0,y0)为p像素坐标,(xn,yn)为q像素坐标,且(xi-1,yi-1)和(xi,yi)是邻接的。根据邻接的类型,可以定义为4通路,8通路,m通路。

令S是图像中的一个像素子集。对于S中的任何像素p,S中连通到该像素的像素集称为S的连通分量。如果S仅有一个连通分量,则称S为连通集。

分割简介
       假设一副图像可以被分割K个非空的子集R1,R2,...,Rn。其中这些子集满足以下条件:

灰度图像一般是根据边界或区域两种情况进行分割,当区域之间的差别很大时,区域间的边界就很明显,这时就可以根据边界进行分割,其优点在于:边缘定位准确,运算速度快;其局限性在于:边缘的连续性和封闭性难以保证,对于复杂图像分割效果较差,出现如:边缘模糊、边缘丢失等现象。边缘检测方法常常依赖于边缘检测算子,从而找到图像边缘;常用的检测算子有: Roberts(精度高、对噪声敏感)、 Sobel(对噪声具有一定平滑,但精度低)、 Prewitt、 Canny(检测阶跃型边缘效果好,抗噪强)、 Laplacian 和 Marr 算子(即 LOG 算子,最早由 marr 等人提出,算法简单,速度快、但对噪声敏感)。若边界不是很明显时,就可以根据同一区域内的像素具有相似性这一特征进行分割,常见的区域分割方法主要有: 区域生长法、分裂合并法和分水岭分割方法。

Ostu基本方法
       本文使用的Ostu方法是基于全局阈值处理的方法。该方法在类间方差最大的情况下是最佳的。其基本概念是好的阈值分类就它的像素灰度值而论应该是截然不同的,反过来说,就它的灰度值而言给出最好的类间分离的阈值就是好最好的阈值。除此之外,Ostu方法还有一个重要的特性,即它完全以在一副图像的直方图上执行计算为基础,直方图是很容易得到的一维阵列。

图像归一化的直方图具有分量pi=ni/MN,ni表示灰度级为i的像素数。由此整幅图像的平均灰度为

现若假定一个阈值K,由K把输入图像阈值化为两类C1和C2,C1由图像中灰度值在范围[0,k]内的所有像素组成,C2由灰度值在范围[k+1,L-1]的所有像素组成。则像素被分类到C1的概率为

直至级k的累积像素灰度均值为

类间方差由此给出

从而最佳阈值为K,就是其最大化类间反差。

遗传算法
       关于遗传算法部分,可参照前面写过的博文 《遗传算法详解》  。

遗传算法Ostu的应用
       在编码方式上面选择由8位二进制表示像素灰度值,同时使用类间方差作为适应度函数,对于选择算子则使用轮盘赌的方法。

下面是算法的基本实现代码

# -*- coding: cp936 -*-import numpy as npimport cv2import random#将不足8位的染色体扩展为8位def expand(k):        for i in range(len(k)):                k[i]=k[i][0:2]+‘0‘*(10-len(k))+k[i][2:len(k)]        return k        def Hist(image):        a=[0]*256        h=image.shape[0]        w=image.shape[1]        MN=h*w        average=0.0        for i in range(w):                for j in range(h):                        pixel=int(image[j][i])                        a[pixel]=a[pixel]+1        for i in range(256):                a[i]=a[i]/float(MN)                average=average+a[i]*i   return (a,average)#适应度算子 Ostu全局算法def fitness(k,hist,averge):        Var=[0]*len(k)        Varg=0.0        for i in range(256):                Varg=Varg+pow((i-average),2)*hist[i]        for j in range(len(k)):                P1=0.0                m=0.0                for i in range(int(k[j],2)+1):                        P1=P1+hist[i]                        m=m+hist[i]*i                Var[j]=pow(average*P1-m,2)/(P1*(1-P1)*Varg+0.00001)        return Var#选择算子 轮盘赌选择算法def wheel_selection(k,Var):        var=[0.0]*len(Var)        s=0.0        n=[‘‘]*len(k)        for i in range(len(Var)):                var[i]=Var[i]/sum(Var)        for i in range(1,len(Var)):                var[i]=var[i]+var[i-1]        for i in range(len(k)):                s=random.random()                for j in range(len(var)):                        if s<=var[j]:                                n[i]=k[j]        return n#变异算子def Variation(Next):       for i in range(len(Next)):               if random.random()<0.06:                        Next[i]=bin(int(Next[i],2)+2)       return Next#交叉算子def Cross(Next):        for i in range(len(Next)-1):                if random.random()<0.6:                        Next[i]=Next[i][:5]+Next[i+1][5:8]+Next[i][8:10]        return Next#im为读取图像的数据#seed表示每一代将要进行选择,复制,变异和交叉的个体#last_fit和now_fit分别表示父子两代群体的最大适应度#k为在规定代数结束后,最大适应度个体的染色体表示,即为最佳阈值a=r‘D:\Python27\0.jpg‘im=cv2.imread(a,0)items=range(0,min(im.shape))random.shuffle(items)x=items[0:20]y=items[21:41]seed=[]last_fit=0.0now_fit=0.0Var=0.0times=0k=0hist,average=Hist(im)for i in range(0,20):   seed.append(bin(im[x[i]][y[i]]))while times<20:        Var=fitness(seed,hist,average)        Next=wheel_selection(seed,Var)        Next=Cross(Next)        Next=expand(Variation(Next))        seed=Next        #Var=fitness(seed,hist,average)                last_fit=now_fit        now_fit=max(Var)        times=times+1print max(Var)for j in range(len(Var)):        if Var[j]==max(Var):                k=int(Next[j],2)print k                

下图为阈值分割后的效果图,在程序多次运行中,发现结果有时会出现随机游走的情况,这个可以通过改变交叉概率和变异概率等参数进行一定程度地改善。

参考资料:

[1] 图像分割方法及性能评价综述,丁亮,张永平,张雪英,中国科技论文在线

[2] 数字图像处理,冈萨雷斯
---------------------
作者:sam-X
来源:CSDN
原文:https://blog.csdn.net/u010945683/article/details/41780491
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/YiYA-blog/p/10079564.html

时间: 2024-08-01 11:28:06

基于遗传算法的Ostu法在图像分割中的应用的相关文章

基于遗传算法的高校排课系统研究

基于遗传算法的高校排课系统研究 沈丽容  陈明磊 (南京林业大学信息学院计算机科学与工程系  南京 210037)     摘  要   提出并实现了一种高校自动排课算法,利用遗传算法建立数据模型,定义一个包含教师编号.班级编号.课程编号.教室编号.上课时间段的染色体编码方案和适应度函数,通过初始化种群.选择.交叉.变异等过程不断进化,最后得到最优解.利用该算法对某高校的真实数据进行实验,结果显示无一例教室.教师.班级冲突,算法具有合理性和可行性.     关键词  遗传算法: 排课问题: 适应

计划:怎样学习在图像分割中水平集算法

水平集方法由 Osher 和 Sethian 于 1988 年提出[1],最初应用于流体力学领域,后被广泛应用于各种同曲线演化相关的科学研究和工程领域.1997 年Caselles等人率先将这一理论应用到图像科学领域后,开始了基于水平集方法的图像处理技术的研究. 为了提高分割的稳健性,先后提出了基于边界边缘的几何轮廓线模型.基于区域的几何轮廓线模型.基于先验形状知识的几何轮廓线模型,纹理图像分割模型.运动图像的分割分割模型及这些模型集成化的图像分割模型.多模型成分集成是近年该学术流派发展的重要趋

基于GraphCuts图割算法的图像分割----OpenCV代码与实现

部分代码与文档是早些时候收集的,出处找不到了,还请原作者看到后联系注明. 图切算法是组合图论的经典算法之一.近年来,许多学者将其应用到图像和视频分割中,取得了很好的效果.本文简单介绍了图切算法和交互式图像分割技术,以及图切算法在交互式图像分割中的应用. 图像分割指图像分成各具特性的区域并提取出感兴趣目标的技术和过程,它是由图像处理到图像分析的关键步骤,是一种基本的计算机视觉技术.只有在图像分割的基础上才能对目标进行特征提取和参数测量,使得更高层的图像分析和理解成为可能.因此对图像分割方法的研究具

《基于遗传算法的自动组卷系统设计与实现 》17

一.基本信息 标题:<基于遗传算法的自动组卷系统设计与实现 > 时间:2016 来源:西北农林科技大学 关键字:自动组卷:遗传算法:早熟:收敛 二.研究内容 问题定义:针对传统的组卷算法组卷速度慢.成功率较低.试卷质量不高的问题,本文提出结合BP算法对遗传算法中遗传因子进行学习训练,提高染色体的适应度,采用目标试卷的题数进行实数编码替代传统的二进制编码方式,对染色体长度进行优化,解决传统遗传算法出现早熟.收敛慢的现象.利用优化的遗传算法设计并实现一个自动组卷系统. 三.流程图 四.总结 通过阅

基于遗传算法求解TSP问题(Java界面)

近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一样的,追加了Java用Graphics画点及画线做路径展示,展示部分做得比較粗糙,须要的拿走,效果图例如以下. 下载地址:http://download.csdn.net/detail/wangqiuyun/7406201 另C#界面版:http://blog.csdn.net/wangqiuyun

Azure 动手演示之一:采用定制化方法在 Azure 中创建虚拟机

也许大家看过很多关于 Windows Azure (Microsoft Azure) 介绍或如何使用的文章,但即使看过很多图片或 PPT,也难以真正理解这一全球领先的公有云平台. 鉴于此,我制作了一系列如何使用 Azure 的视频录像,主要是实时录制我在屏幕上对 Azure 的操作.希望能对大家深入的了解 Windows Azure (Microsoft Azure) 有所帮助. 本演示看上去非常简单,目的是如何在 Azure 上创建虚拟机,但事实上,它是如何在 Azure 上创建整个企业部署的

实现一个基于 SharePoint 2013 的 Timecard 应用(中)

门户视图 随着 Timecard 列表的增多,如何查找和管理这许多的 Timecard 也就成了问题.尤其对于团队经理而言,他除了自己填写的 Timecard,还要审核团队成员的 Timecard 任务更重. 这里我把实际的需求简化成为 2 个主要的视图(但能够提供的效果和实际需求其实是非常接近的): Time Window 视图这个视图列出当前用户在所有可以填写的时间窗口中是否提交了 Timecard,起到提醒的作用. Timecard 视图这个视图列出在 Timecard 网站中,所有当前用

[家里蹲大学数学杂志]第054期图像分割中的无边缘活动轮廓模型

$\bf 摘要$: 本文给出了王大凯等编的<图像处理中的偏微分方程方法>第 4.4 节的详细论述. $\bf 关键词$: 图像分割; 活动轮廓模型; matlab 编程 1 模型的建立 在图像中, 对象与背景的区别有时表现为平均灰度的明显不同. 由于这类图像既没有明显的边缘 ($\sev{\n I}$ 大), 也缺乏明显的纹理 (texture, 灰度变化有一定的规律, 并形成一定的 patten), 故测地线活动轮廓 (geodesic active contour, GAC, 或 snak

基于H.264协议的视频传输系统中遇到的问题以及解决办法

问题1.视频压缩解码模块在运用的时候出现错误:解码器再解码第二帧视频图片的时候出现异常 client: ../../decoder/T264dec.c:594:T264dec_decode_nal: Assertion `0' failed. Aborted 对于该问题的分析及解决过程为: 1.  修改数据类型,所有缓存区改为unsigned char类型(原来统一为char 类型),但是还是遇到一样的异常错误,问题没有解决. 2.  查看缓存区具体内容是否与服务器端压缩的数据是一致的的,对照数