融合遗传算法的多域值分块低照度图像增强算法
该算法主要分为颜色空间转换、亮度增强、细节增强和多尺度融合四个阶段,其流程如下图 所示。
- 为 防止算法在增强图像亮度时改变图像的颜色信息,先将低照度图像从 RGB 空间转换至 HSV 空间,其中 Image H 和 Image S 表征图像的色彩信息, Image V 表征图像的亮度信息,由此分离图像的颜色信息和亮度信息。
- 利用遗传算法求出 Image V 的最优分割阈值,将 Image V 分为亮度不同的多个子图。
- 采用多阈值分块增强算法对各子图进行亮度的评判和增强,得到亮度增强后的 Image A。
- 为增强图像的细节信息,利用引导滤波算法和反锐化掩模算法提取图像 Image V 的轮廓信息 Image C和纹理信息 Image B。
- 借鉴多尺度融合思想将 Image A、Image B 和 Image C 加权融合,重构出曝光度正常且细节信息丰富的 Image V1。
- 最后将 Image V1、Image H 和 Image S 转换为细节清晰、对比度高且视觉效果良好的高质量 RGB 图像。
遗传算法用于图像去噪
1. 种群初始化
def firstPopulation(size):
population = []
for i in range(size):
population.append((randint(1, 40), randint(1, 40), randint(1, 6)))
return population
经过以上代码,firstPopulation
函数返回一个包含 size
个元素的Population
列表,其中每个元素都是一个包含三个由 randint
函数生成的随机整数的元组,这三个参数通常是个体的基因表达方式,它们代表了某种问题的解或优化问题中的一组参数。firstPopulation
函数调用时需要接收一个参数 size
,以确定生成的种群中有多少个个体。这个参数决定了返回的列表的长度。
2. 适应度函数设计
def fitness(h, twindows, swindows):
img_denoise = cv2.fastNlMeansDenoising(img_noise, None, h, twindows, swindows)
fit = 1 / mad(img_denoise, axis=None)
return fit
适应度函数fitness有三个接收参数:h,twindow及swindows,这三个参数也是对含噪图像进行快速非局部均值去噪(fastNlMeansDenoising)的参数,通过在整幅图像计算去噪后图像的中位数绝对偏差(MAD)的倒数得到适应度,在这一步,适应度值 fit
被定义为 MAD 的倒数。这是因为在遗传算法中,我们通常尝试最大化适应度值,而 MAD 的值越小表示图像的噪声越少,所以取倒数可以将问题转换为最小化问题。
3. 计算种群的适应度
def computePerfPopulation(population):
populationPerf = {}
for i in population:
populationPerf[i] = fitness(i[0], i[1], i[2])
return sorted(populationPerf.items(), key=operator.itemgetter(1), reverse=True)
函数computePerfPopulation是为了计算种群中个体的适应度,其接收参数也为第一步中经过初始化的种群,随后定义字典populationPerf,对于population的每个个体i,其有三个参数(种群初始化),将这三个参数作为fitness函数的接收参数计算种群中每个个体的适应度,存储再populationPerf中,populationPerf.items()返回包含字典所有键值对的视图对象,随后通过key=operator.itemgetter(1)按照populationPerf的第二个元素进行排序,reverse=True按照从大到小排序。
4. 种群的自然选择
def selectFromPopulation(populationSorted, best_sample, lucky_few):
nextGeneration = []
for i in range(best_sample):
nextGeneration.append(populationSorted[i][0])
for i in range(lucky_few):
nextGeneration.append(random.choice(populationSorted)[0])
random.shuffle(nextGeneration)
return nextGeneration
这里是对经过适应度计算的种群进行自然选择产生下一代种群,populationSorted是经过适应度计算的种群,best_sample是要选择的适应度较好的个体的个数,lucky_few是要选择的幸运个体个数。
5. 种群的交叉
def createChild(pai1, pai2):
child = ((pai1[0], pai1[1], pai2[2]))
return child
def next_generation(population):
ng = population
for i in range(0, (len(population) - 1), 2):
ng.append(createChild(population[i], population[i + 2]))
ng.append(createChild(population[i + 2], population[i]))
return ng
6. 种群的基因突变
def mutateGene(indi):
aux = list(indi)
index_modification = int(randint(0, len(indi) - 2))
if random.random() * 100 < 50:
aux[index_modification] += randint(0, 5)
else:
aux[index_modification] -= randint(0, 5)
return tuple(aux)
def mutatePopulation(pop, chance_de_mut):
for i in range(len(pop)):
if random.random() * 100 < chance_de_mut:
pop[i] = mutateGene(pop[i])
一些相关材料:
【论文复现】遗传算法图像去噪:Effective Hybrid Genetic Algorithm (EHGA)