基于遗传算法的图像二值化
[toc]
基于遗传算法的图像二值化
本实验采用遗传算法和大津算法确定图像二值化的最佳阈值,从而对图像进行二值化分割
(重庆大学2020级软件学院人工智能导论第一次实验)
大津算法(OTSU)
最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法.
它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小
实验思路
Q&A
1.如何建立灰度图和染色体的联系:
灰度图中,每个像素点的灰度值从0到255,二进制形式是8比特位,将八个比特位看成一个染色体,每一个比特位就是一个基因点。
2.如何考虑选择下一代种群:
首先先把种群中的每一个个体计算适应度,借助OTSU算法,计算得出个体适应度,适应度的大小即可表示个体的优劣程度。但不能只选出色的个体,有些不好的个体可能会产生优质的下一代个体,因此在选择的时候,考虑首先选择前百分比a的优秀个体,剩下的个体中,随机选取比例b的个体幸存,其余淘汰。
3.如何考虑变异:
考虑到真实的环境中变异的可能性比较小,所以设定了一个变异概
率来控制变异的可能性。
最终代码:
1 | import numpy as np |
1 | def imshow(img,mode=0):#0表示灰度图,1表示彩色图 |
1 | filename="./img02.jpg" |
RGB (1200, 1200) JPEG
1 | array = np.array(img) |
1 | #手写convert('L'), L = R * 299/1000 + G * 587/1000+ B * 114/1000RGB转灰度图 |
1 | imshow(grayarray,0) |
1 | def ostu(image,threshold): |
1 | class GA: |
1 | ga=GA(grayarray) |
D:\anaconda3\envs\pytorch\lib\site-packages\ipykernel_launcher.py:10: RuntimeWarning: invalid value encountered in double_scalars
# Remove the CWD from sys.path while we load stuff.
阈值: 112 适应度 2614.823209590889
阈值: 112 适应度 2614.823209590889
阈值: 112 适应度 2614.823209590889
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
D:\anaconda3\envs\pytorch\lib\site-packages\ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in double_scalars
# This is added back by InteractiveShellApp.init_path()
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
阈值: 106 适应度 2621.80194615949
1 | maxtmp=0 |
D:\anaconda3\envs\pytorch\lib\site-packages\ipykernel_launcher.py:10: RuntimeWarning: invalid value encountered in double_scalars
# Remove the CWD from sys.path while we load stuff.
106 2621.80194615949
D:\anaconda3\envs\pytorch\lib\site-packages\ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in double_scalars
# This is added back by InteractiveShellApp.init_path()
1 | intensity_array = np.where(grayarray<y, 0, 255) |
[[ 0 0 0 ... 255 255 255]
[ 0 0 0 ... 255 255 255]
[ 0 0 0 ... 255 255 255]
...
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]]
1 | imshow(intensity_array) |
实验反思
其实可以暴力枚举,或许效果更好且更快,但因为要求是用遗传算法,所以还是用到遗传算法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 早早起床,拥抱太阳!