以下内容需要直方图均衡化、规定化知识

直方图均衡化应用:

图像直方图均衡化能拉伸灰度图,让像素值均匀分布在0,255之间,使图像看起来不会太亮或太暗,常用于图像增强;

直方图规定化应用:

举个例子,当我们需要对多张图像进行拼接时,我们希望这些图片的亮度、饱和度保持一致,事实上就是让它们的直方图分布一致,这时就需要直方图规定化。

直方图规定化与均衡化的思想一致,事实上就是找到各个灰度级别的映射关系。具体实现的过程中一般会选一个参考图像记为A,找到A的直方图与目标图像的直方图的映射关系,从而找到目标图像的像素以A为“参考”时的映射关系。

具体实现可参考文中链接(看完茅塞顿开)

基于python利用直方图规定化统一图像风格

参考图像

原始图像(第一行)/处理后的图像(第二行)

源码:

import os

import cv2

import numpy as np

def get_map(Hist):

# 计算概率分布Pr

sum_Hist = sum(Hist)

Pr = Hist/sum_Hist

# 计算累计概率Sk

Sk = []

temp_sum = 0

for n in Pr:

temp_sum = temp_sum + n

Sk.append(temp_sum)

Sk = np.array(Sk)

# 计算映射关系img_map

img_map = []

for m in range(256):

temp_map = int(255*Sk[m] + 0.5)

img_map.append(temp_map)

img_map = np.array(img_map)

return img_map

def get_off_map(map_): # 计算反向映射,寻找最小期望

map_2 = list(map_)

off_map = []

temp_pre = 0 # 如果循环开始就找不到映射时,默认映射为0

for n in range(256):

try:

temp1 = map_2.index(n)

temp_pre = temp1

except BaseException:

temp1 = temp_pre # 找不到映射关系时,近似取向前最近的有效映射值

off_map.append(temp1)

off_map = np.array(off_map)

return off_map

def get_infer_map(infer_img):

infer_Hist_b = cv2.calcHist([infer_img], [0], None, [256], [0,255])

infer_Hist_g = cv2.calcHist([infer_img], [1], None, [256], [0,255])

infer_Hist_r = cv2.calcHist([infer_img], [2], None, [256], [0,255])

infer_b_map = get_map(infer_Hist_b)

infer_g_map = get_map(infer_Hist_g)

infer_r_map = get_map(infer_Hist_r)

infer_b_off_map = get_off_map(infer_b_map)

infer_g_off_map = get_off_map(infer_g_map)

infer_r_off_map = get_off_map(infer_r_map)

return [infer_b_off_map, infer_g_off_map, infer_r_off_map]

def get_finalmap(org_map, infer_off_map): # 计算原始图像到最终输出图像的映射关系

org_map = list(org_map)

infer_off_map = list(infer_off_map)

final_map = []

for n in range(256):

temp1 = org_map[n]

temp2 = infer_off_map[temp1]

final_map.append(temp2)

final_map = np.array(final_map)

return final_map

def get_newimg(img_org, org2infer_maps):

w, h, _ = img_org.shape

b, g ,r =cv2.split(img_org)

for i in range(w):

for j in range(h):

temp1 = b[i,j]

b[i,j] = org2infer_maps[0][temp1]

for i in range(w):

for j in range(h):

temp1 = g[i,j]

g[i,j] = org2infer_maps[1][temp1]

for i in range(w):

for j in range(h):

temp1 = r[i,j]

r[i,j] = org2infer_maps[2][temp1]

newimg = cv2.merge([b,g,r])

return newimg

def get_new_img(img_org, infer_map):

org_Hist_b = cv2.calcHist([img_org], [0], None, [256], [0,255])

org_Hist_g = cv2.calcHist([img_org], [1], None, [256], [0,255])

org_Hist_r = cv2.calcHist([img_org], [2], None, [256], [0,255])

org_b_map = get_map(org_Hist_b)

org_g_map = get_map(org_Hist_g)

org_r_map = get_map(org_Hist_r)

org2infer_map_b = get_finalmap(org_b_map, infer_map[0])

org2infer_map_g = get_finalmap(org_g_map, infer_map[1])

org2infer_map_r = get_finalmap(org_r_map, infer_map[2])

return get_newimg(img_org, [org2infer_map_b, org2infer_map_g, org2infer_map_r])

if __name__ == "__main__":

dstroot = './imgs'

infer_img_path = './abc.png'

infer_img = cv2.imread(infer_img_path)

outroot = './out1'

infer_map = get_infer_map(infer_img) # 计算参考映射关系

dstlist = os.listdir(dstroot)

for n in dstlist:

img_path = os.path.join(dstroot, n)

print(img_path)

img_org = cv2.imread(img_path)

new_img = get_new_img(img_org, infer_map) # 根据映射关系获得新的图像

new_path = os.path.join(outroot, n)

cv2.imwrite(new_path, new_img)

python直方图规定化_python用直方图规定化实现图像风格转换相关推荐

  1. python对图像二值化_python如何二值化图像

    在python中二值化图像的方法:首先将图片转化为灰色图像:然后自定义灰度界限:最后输入"photo=Img.point(table,'1')"命令(table为自己创建的数组名) ...

  2. python头像动漫化_Python头像动漫化,快来生成一个自己的动漫头像吧

    一.前言 很多时候我们都会为头像发愁,像我这种万年不换头像的咸鱼从来没有这种烦恼.但是吧,有个个性化的头像还是非常有趣的,因为这个抠鼻屎的头像除了抠鼻屎这点,其它都很符合本人的气质,所以已经够用了.但 ...

  3. java能像python弄字典吗_python字典和结构化数据

    5.1 字典数据类型 字典的索引可以使用许多不同类型的数据,不只是整数.字典的索引被称为"键",键及其关联的值称为"键-值"对,在代码中,字典输入时带花括号{} ...

  4. python画正切函数_python的pygal模块绘制反正切函数图像方法

    python的pygal模块绘制反正切函数图像方法 python是一个很有趣的语言,可以在命令行窗口运行.python中有很多功能强大的模块,这篇经验告诉你,如何使用python的pygal模块绘制反 ...

  5. python数字类型转换函数_python中的各种数据类型中的数据格式转换

    一,转换list中的数据格式 str --> float (一)使用自定义函数 def str2float(list) strlist=[] for i in list: strlist.app ...

  6. python用户界面导入图片_python学习笔记之11:图像用户界面

    这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓"GUI工具包"的有很多,本文简要介绍最成熟的跨平台pyt ...

  7. python滤波器的截面图_Python OpenCV学习笔记之:图像滤波处理

    # -*- coding: utf-8 -*- # 图像滤波 ''' 图像处理也支持低通滤波(LPF)和高通滤波(HPF)处理 OpenCV提供filter2D函数对图像进行滤波处理 ''' impo ...

  8. python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

  9. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

最新文章

  1. typora公式zuo对齐_latex公式如何居左对齐
  2. 跟我一起使用electron搭建一个文件浏览器吧
  3. php基于数组的分页实现
  4. RESTFfu l规范 以及理解
  5. Summary - 2017
  6. 在开发iOS程序时对日期处理的总结
  7. 【视频】时间序列分析:ARIMA-ARCH / GARCH模型分析股票价格
  8. 将已发送的短信写入短信数据库
  9. YonBIP—助力企业数字化转型之道
  10. SQL查询语句的基本使用方法
  11. SSIM(structural similarity index) ---图像质量评价指标之结构相似性
  12. 【Excel高效工作1】5分钟,从Excel中批量将联系人信息导入手机电话簿
  13. hdu4699 Editor(栈)
  14. 解决pycharm下载第三方库速度慢的问题
  15. 笔记本外接显示器教程级后续使用技巧
  16. thinkPHP中{$Think }用法
  17. 量子研究再获突破能否成功解决核潜艇通信难题?
  18. 使用机器学习来进行应用识别
  19. 圣诞节要到了,如何制作自己的一个给头像戴帽子的小程序,请看这
  20. Vscode运行java代码和c++代码时Terminal输出乱码?

热门文章

  1. 重邮大学计算机基础考试试题及答案,重庆邮电大学《大学计算机基础(2015》考试试卷.pdf...
  2. Salesforce邮件发进垃圾邮箱或未收到SF邮件处理方式 (DKIM - New CNAME Version)
  3. java计算机毕业设计购物网站设计(附源码、数据库)
  4. Qt5官方demo解析集34——Concentric Circles Example
  5. Julia语言与其他语言的异同
  6. Spring Data Querydsl-JPA 的简单入门笔记
  7. Windows系统通用定时关机命令
  8. Android-X5WebView封装(Cookie管理、进度监听、适配8.1系统等策略)
  9. php 回到顶部,回到顶部总结
  10. 管理系统:登录成功后可以选择自己的角色,并查看角色的工作任务(使用多态和抽象类来完成)...