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

均衡化:https://blog.csdn.net/macunshi/article/details/79815870

规定化:https://blog.csdn.net/macunshi/article/details/79819263

直方图均衡化应用:

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

直方图规定化应用:

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

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

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

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

参考图像

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

源码:

  1. import os
  2. import cv2
  3. import numpy as np
  4.  
  5. def get_map(Hist):
  6. # 计算概率分布Pr
  7. sum_Hist = sum(Hist)
  8. Pr = Hist/sum_Hist
  9. # 计算累计概率Sk
  10. Sk = []
  11. temp_sum = 0
  12. for n in Pr:
  13. temp_sum = temp_sum + n
  14. Sk.append(temp_sum)
  15. Sk = np.array(Sk)
  16. # 计算映射关系img_map
  17. img_map = []
  18. for m in range(256):
  19. temp_map = int(255*Sk[m] + 0.5)
  20. img_map.append(temp_map)
  21. img_map = np.array(img_map)
  22. return img_map
  23.  
  24. def get_off_map(map_): # 计算反向映射,寻找最小期望
  25. map_2 = list(map_)
  26. off_map = []
  27. temp_pre = 0 # 如果循环开始就找不到映射时,默认映射为0
  28. for n in range(256):
  29. try:
  30. temp1 = map_2.index(n)
  31. temp_pre = temp1
  32. except BaseException:
  33. temp1 = temp_pre # 找不到映射关系时,近似取向前最近的有效映射值
  34. off_map.append(temp1)
  35. off_map = np.array(off_map)
  36. return off_map
  37.  
  38. def get_infer_map(infer_img):
  39. infer_Hist_b = cv2.calcHist([infer_img], [0], None, [256], [0,255])
  40. infer_Hist_g = cv2.calcHist([infer_img], [1], None, [256], [0,255])
  41. infer_Hist_r = cv2.calcHist([infer_img], [2], None, [256], [0,255])
  42. infer_b_map = get_map(infer_Hist_b)
  43. infer_g_map = get_map(infer_Hist_g)
  44. infer_r_map = get_map(infer_Hist_r)
  45. infer_b_off_map = get_off_map(infer_b_map)
  46. infer_g_off_map = get_off_map(infer_g_map)
  47. infer_r_off_map = get_off_map(infer_r_map)
  48. return [infer_b_off_map, infer_g_off_map, infer_r_off_map]
  49.  
  50. def get_finalmap(org_map, infer_off_map): # 计算原始图像到最终输出图像的映射关系
  51. org_map = list(org_map)
  52. infer_off_map = list(infer_off_map)
  53. final_map = []
  54. for n in range(256):
  55. temp1 = org_map[n]
  56. temp2 = infer_off_map[temp1]
  57. final_map.append(temp2)
  58. final_map = np.array(final_map)
  59. return final_map
  60.  
  61. def get_newimg(img_org, org2infer_maps):
  62. w, h, _ = img_org.shape
  63. b, g ,r =cv2.split(img_org)
  64. for i in range(w):
  65. for j in range(h):
  66. temp1 = b[i,j]
  67. b[i,j] = org2infer_maps[0][temp1]
  68. for i in range(w):
  69. for j in range(h):
  70. temp1 = g[i,j]
  71. g[i,j] = org2infer_maps[1][temp1]
  72. for i in range(w):
  73. for j in range(h):
  74. temp1 = r[i,j]
  75. r[i,j] = org2infer_maps[2][temp1]
  76. newimg = cv2.merge([b,g,r])
  77. return newimg
  78.  
  79. def get_new_img(img_org, infer_map):
  80. org_Hist_b = cv2.calcHist([img_org], [0], None, [256], [0,255])
  81. org_Hist_g = cv2.calcHist([img_org], [1], None, [256], [0,255])
  82. org_Hist_r = cv2.calcHist([img_org], [2], None, [256], [0,255])
  83. org_b_map = get_map(org_Hist_b)
  84. org_g_map = get_map(org_Hist_g)
  85. org_r_map = get_map(org_Hist_r)
  86. org2infer_map_b = get_finalmap(org_b_map, infer_map[0])
  87. org2infer_map_g = get_finalmap(org_g_map, infer_map[1])
  88. org2infer_map_r = get_finalmap(org_r_map, infer_map[2])
  89. return get_newimg(img_org, [org2infer_map_b, org2infer_map_g, org2infer_map_r])
  90.  
  91. if __name__ == "__main__":
  92. dstroot = './imgs'
  93. infer_img_path = './abc.png'
  94. infer_img = cv2.imread(infer_img_path)
  95. outroot = './out1'
  96. infer_map = get_infer_map(infer_img) # 计算参考映射关系
  97. dstlist = os.listdir(dstroot)
  98. for n in dstlist:
  99. img_path = os.path.join(dstroot, n)
  100. print(img_path)
  101. img_org = cv2.imread(img_path)
  102. new_img = get_new_img(img_org, infer_map) # 根据映射关系获得新的图像
  103. new_path = os.path.join(outroot, n)
  104. cv2.imwrite(new_path, new_img)

  

python用直方图规定化实现图像风格转换的更多相关文章

  1. Ubuntu16.04+GTX1080配置TensorFlow并实现图像风格转换

    1. TensorFlow TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,表达了高层次的机器学习计算,大幅简化了第一代系统,并且具备更好的灵活性和可延展性. Te ...

  2. Python之数据规整化:清理、转换、合并、重塑

    Python之数据规整化:清理.转换.合并.重塑 1. 合并数据集 pandas.merge可根据一个或者多个不同DataFrame中的行连接起来. pandas.concat可以沿着一条轴将多个对象 ...

  3. A Neural Algorithm of Artistic Style 图像风格转换 - keras简化版实现

    前言 深度学习是最近比较热的词语.说到深度学习的应用,第一个想到的就是Prisma App的图像风格转换.既然感兴趣就直接开始干,读了论文,一知半解:看了别人的源码,才算大概了解的具体的实现,也惊叹别 ...

  4. 「新手必看」Python+Opencv实现摄像头调用RGB图像并转换成HSV模型

    在ROS机器人的应用开发中,调用摄像头进行机器视觉处理是比较常见的方法,现在把利用opencv和python语言实现摄像头调用并转换成HSV模型的方法分享出来,希望能对学习ROS机器人的新手们一点帮助 ...

  5. 【神经网络与深度学习】neural-style、chainer-fast-neuralstyle图像风格转换使用

    neural-style 官方地址:这个是使用torch7实现的;torch7安装比较麻烦.我这里使用的是大神使用TensorFlow实现的https://github.com/anishathaly ...

  6. fast neural style transfer图像风格迁移基于tensorflow实现

    引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...

  7. 神经风格转换Neural Style Transfer a review

    原文:http://mp.weixin.qq.com/s/t_jknoYuyAM9fu6CI8OdNw 作者:Yongcheng Jing 等 机器之心编译 风格迁移是近来人工智能领域内的一个热门研究 ...

  8. [python-opencv]图像二值化【图像阈值】

    图像二值化[图像阈值]简介: 如果灰度图像的像素值大于阈值,则为其分配一个值(可以是白色255),否则为其分配另一个值(可以是黑色0) 图像二值化就是将灰度图像上的像素值设置为0或255,也就是将整个 ...

  9. Win8Metro(C#)数字图像处理--2.34直方图规定化

    原文:Win8Metro(C#)数字图像处理--2.34直方图规定化  [函数名称] WriteableBitmap HistogramSpecificateProcess(WriteableBi ...

随机推荐

  1. Chisel3 - Tutorial - FullAdder

    https://mp.weixin.qq.com/s/Aye-SrUUuIP6_o67Rlt5OQ   全加器   逻辑图如下: ​​   参考链接: https://github.com/ucb-b ...

  2. JavaScript (一) js的介绍及基本语法变量

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JS 的 介绍 1.JavaScript :简称 : js js 分为三个部分: 1. ECMASc ...

  3. Java实现 LeetCode 392 判断子序列

    392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符 ...

  4. Java实现 蓝桥杯VIP 算法训练 一元三次方程

    问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  5. 连接mongoodb并且向数据库添加信息

    连接mongoodb 首先安装mongoose 配置URL 连接Mongoodb数据库 控制台输入指令运行该js文件 像这样就连接成功了 向Mongodb数据库增加信息,首先需要写入表格信息 接着解构 ...

  6. Java虚拟机性能调优(一)

    Java虚拟机监控与调优,借助Java自带分析工具. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 jstat:JVM Statistics M ...

  7. js防抖函数

    一.什么是函数防抖 概念:函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间. 举个栗子,坐电梯的时候,如 ...

  8. @codeforces - 506C@ Mr. Kitayuta vs. Bamboos

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个竹子,第 i 个竹子初始高度 hi,在每天结束时将长高 a ...

  9. springboot整合Mybatis(无xml)

    1.pom文件 依赖引入 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  10. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...