#基于遗传算法的图像分割
#目标:最大化目标与背景之间的类间方差或最小化目标像素内的类间方差
#编码:8位二进制编码
#适应度函数:
#选择:轮盘赌
#变异:单点变异
import numpy as np
import cv2
import random
import matplotlib.pyplot as plt
from skimage import transform,data
#读入灰度图像
Image = cv2.imread('test_3.jpeg',cv2.IMREAD_GRAYSCALE)
height, width = Image.shape[:2]
Image_re = cv2.resize(Image,(int(height*0.1),int(width*0.1)))
im = np.array(Image_re,dtype=np.float)
im_copy = np.array(Image,dtype=np.float)
im_res = im_copy.copy()
im_ga = np.copy(im)
lchorm = 8 #染色体长度
popsize = 10 #种群大小
cross_rate = 0.7 #交叉概率
mutation_rate = 0.4 #变异概率
maxgen = 150 #最大代数
MN = np.shape(im_ga)
fit = []
yuzhi = []
b = []
fitness = []
popsize1 = 0
oldpop1 = []
fitness1 = []
b1 = []
#初始化种群
def Initpop():
global lchorm,popsize,im_ga
oldpop = []
for i in range(popsize):
temp = '0'*lchorm
for j in range(lchorm):
if random.random()<0.5:
temp = temp[0:j]+'1'+temp[j+1:]
oldpop.append(temp)
return oldpop
#a = Initpop(lchorm,popsize,im_ga)
#print(a)
oldpop = Initpop()
#计算适应度并排序
def Fitness_order():
global gen,popsize,oldpop,MN,lchorm,fit,yuzhi,popsize1,oldpop1,fitness,b,fitness1,b1
if popsize>=5:
popsize = round(popsize-0.03*gen)
#到进化末期的时候调整种群规模和交叉、变异概率
if gen == 75:
cross_rate = 0.3
mutation_rate = 0.3
if gen > 1:
t = oldpop
j = popsize1
for i in range(popsize):
if j >= 1:
oldpop[i] = t[j-1]
j = j-1
#计算适应度值并排序
fitness = []
b = []
for i in range(popsize):
lowsum = 0.0
higsum = 0.0
lownum = 0.0
hignum = 0.0
temp_ = oldpop[i]
c = int(temp_,2)
b.append(c*255/(2**lchorm-1))
for x in range(MN[0]):
for y in range(MN[1]):
if(im_ga[x,y] <= b[i]):
lowsum = lowsum + im_ga[x,y]#统计低于阈值的灰度值的总和
lownum = lownum + 1.0 #统计低于阈值的灰度值的像素的总个数
else:
higsum = higsum + im_ga[x,y]#统计高于阈值的灰度值的总和
hignum = hignum + 1.0 #统计高于阈值的灰度值的像素的总个数
#求u1、u2为对应于两类的平均灰度值
if lownum != 0:
u1 = lowsum/lownum
else:
u1 = 0
if hignum != 0:
u2 = higsum/hignum
else:
u2 = 0
x = lownum*hignum*(u1-u2)**2
fitness.append(x)#计算适应度
test = 1
if gen == 1: #如果为第一代,从小往大排序
for i in range(popsize):
j = i + 1
while(j <=popsize-1):
if fitness[i] > fitness[j]:
tempf = fitness[i]
tempc = oldpop[i]
tempb = b[i]
b[i] = b[j]
b[j] = tempb
fitness[i] = fitness[j]
fitness[j] = tempf
oldpop[i] = oldpop[j]
oldpop[j] = tempc
j = j+1
fitness1 = fitness.copy()
b1 = b.copy()
oldpop1 = oldpop.copy()
popsize1 = popsize
else:
for i in range(popsize):
j = i + 1
while(j <=popsize-1):
if fitness[i] > fitness[j]:
tempf = fitness[i]
tempc = oldpop[i]
tempb = b[i]
b[i] = b[j]
b[j] = tempb
fitness[i] = fitness[j]
fitness[j] = tempf
oldpop[i] = oldpop[j]
oldpop[j] = tempc
j = j+1
for i in range(popsize1):
j = i + 1
while(j <= popsize1-1):
if fitness1[i] > fitness1[j]:
tempf = fitness1[i]
tempc = oldpop1[i]
tempb = b1[i]
b1[i] = b1[j]
b1[j] = tempb
fitness1[i] = fitness1[j]
fitness1[j] = tempf
oldpop1[i] = oldpop1[j]
oldpop1[j] = tempc
j = j+1
if gen == 1:
fit.append(fitness[-1])
yuzhi.append(b[-1])
yuzhisum = 0
else:
if (fitness[-1]>fitness1[-1]):
yuzhi.append(b[-1])
fit.append(fitness[-1])
else:
yuzhi.append(b1[-1])
fit.append(fitness1[-1])
return
def Select():
global gen,fitness,popsize,oldpop,b,fitness1,popsize1,oldpop1,b1
s = popsize1 + 1
for j in range(popsize-1,-1,-1):
if fitness[-1]<fitness1[j]:
s = j
temp=oldpop.copy()
if s!=popsize1 + 1:
if gen < 50:#小于50代用上一代中用适应度值大于当前代的个体随机代替当前代中的个体
for i in range(s,popsize1):
j = int(random.random()*popsize-0.00001)
temp[j] = oldpop1[i]
b[j] = b1[i]
fitness[j] = fitness1[i]
else:
if gen < 100:
j = 0
for i in range(s,popsize1):
temp[j] = oldpop1[i]
b[j] = b1[i]
fitness[j] = fitness1[i]
j = j+1
else:
j = popsize1-1
for i in range(int(popsize/2)):
temp[i] = oldpop1[j]
b[i] = b1[j]
fitness[i] = fitness1[j]
j = j-1
b1 = b.copy()
fitness1 = fitness.copy()
oldpop1 = temp.copy()
popsize1 = popsize
return temp
def Crossover():
global temp,popsize,cross_rate,lchorm
parent = []
a = []
for i in range(popsize):
if (random.random()<cross_rate):
parent.append(temp[i])
a.append(i)
j = len(parent)
if j%2 != 0:
j = j-1
if j >= 2:
for k in range(0,j,2):
cutpoint = random.randint(0,lchorm-1)
f = k
temp[a[f]] = parent[f][:cutpoint]+parent[f+1][cutpoint:]
temp[a[f+1]] = parent[f+1][:cutpoint]+parent[f][cutpoint:]
return
def Mutation():
global popsize,lchorm,mutation_rate,temp,newpop,oldpop
gasum = lchorm*popsize
mutnum = round(mutation_rate*gasum)
for i in range(mutnum):
s = random.randint(0,lchorm-1)
t = random.randint(0,popsize-1)
if temp[t][s] == '1':
temp[t] = temp[t][:s]+'0'+temp[t][s+1:]
else:
temp[t] = temp[t][:s]+'1'+temp[t][s+1:]
oldpop = temp.copy()
return
for gen in range(maxgen):
gen = gen+1
Fitness_order()
temp = Select()
Crossover()
Mutation()
for i in range(np.shape(im_res)[0]):
for j in range(np.shape(im_res)[1]):
if im_res[i][j] <= yuzhi[-1]:
im_res[i][j] = 0
else:
im_res[i][j] = 255
fig, axes = plt.subplots(1,2, figsize=(10, 6))
#axes[0] = plt.plot(range(gen),fit)
#print(fit)
#print(yuzhi)
axes[0].imshow(im_copy, cmap='gray')
axes[0].set_title('first')
axes[0].set_axis_off()
axes[1].imshow(im_res, cmap='gray')
axes[1].set_title('second')
axes[1].set_axis_off()
#axes[1][0].plot(range(gen),fit)
print(yuzhi[-1])
plt.show()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
```python import numpy as np import cv2 def image_segmentation(image_path): # 读取图像 image = cv2.imread(image_path) # 将图像转换为灰度图 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用Otsu阈值分割算法进行图像分割 _, segmented_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) return segmented_image # 调用函数进行图像分割 segmented_image = image_segmentation("image.jpg") # 显示图像分割结果 cv2.imshow("Segmented Image", s
资源推荐
资源详情
资源评论
收起资源包目录
SYS.zip (6个子文件)
ga_seg.py 8KB
test_3.jpeg 64KB
test_2.jpeg 21KB
wavelet.py 5KB
demo.jpg 161KB
snake.py 1KB
共 6 条
- 1
资源评论
荒野大飞
- 粉丝: 9290
- 资源: 413
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_0694.GIF
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
- 基于Python+OpenCV对多张图片进行全景图像拼接,消除鬼影,消除裂缝+源代码+文档说明+界面截图(高分课程设计)
- 基于C++实现的全景图像拼接源码(课程设计)
- 基于SIFT特征点提取和RASIC算法实现全景图像拼接python源码+文档说明+界面截图+详细注释(95分以上课程大作业)
- 基于matlab实现眼部判别的疲劳检测系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功