当前位置:   article > 正文

【3】python-opencv3教程:图像的对比度增强(线性变化,直方图正规化,伽马变化,全局直方图均衡化,限制对比度的自适应直方图均衡化)_opencv增加图像对比度

opencv增加图像对比度

第三节:对比度增强算法总结

一: 绘制直方图

        就是把各个像素值所含有的个数统计出来,然后画图表示。 可以看到在当前图像中,哪个像素值的个数最多。 同时,可以看当前图像总体的像素值大小在哪些范围。。靠近0的话,说明图像偏暗。 靠近255,说明图像偏亮。

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import math
  5. # # 绘制灰度直方图
  6. def calcGrayHist(image):
  7. '''
  8. 统计像素值
  9. :param image:
  10. :return:
  11. '''
  12. # 灰度图像的高,宽
  13. rows, cols = image.shape
  14. # 存储灰度直方图
  15. grayHist = np.zeros([256], np.uint64)
  16. for r in range(rows):
  17. for c in range(cols):
  18. grayHist[image[r][c]] += 1
  19. return grayHist
  20. image = cv2.imread('p2.jpg', cv2.IMREAD_GRAYSCALE)
  21. grayHist = calcGrayHist(image)
  22. # 采用matplotlib进行画图
  23. x_range = range(256)
  24. plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
  25. plt.show()

输出结果:

   总的来说,还是偏暗 。像素值几种在40到50之间。

二:  通过线性变化增强对比度

     Python实现

  1. # 通过线性变化增强对比度
  2. in_image =cv2.imread('p2.jpg', cv2.IMREAD_GRAYSCALE)
  3. a = 2
  4. out_image = float(a) * in_image
  5. # 进行数据截断, 大于255的值要截断为255
  6. out_image[out_image > 255] = 255
  7. # 数据类型转化
  8. out_image = np.round(out_image)
  9. out_image = out_image.astype(np.uint8)
  10. # 显示原图像和线性变化后的结果
  11. cv2.imshow('IN', in_image)
  12. cv2.imshow('OUT', out_image)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows()

   输出结果:

 

三: 通过直方图正规化增强对比度

      Python代码实现:

  1. # 通过直方图正规化增强对比度
  2. in_image = cv2.imread('p2.jpg', cv2.IMREAD_GRAYSCALE)
  3. # 求输入图片像素最大值和最小值
  4. Imax = np.max(in_image)
  5. Imin = np.min(in_image)
  6. # 要输出的最小灰度级和最大灰度级
  7. Omin, Omax = 0, 255
  8. # 计算a 和 b的值
  9. a = float(Omax - Omin)/(Imax - Imin)
  10. b = Omin - a* Imin
  11. # 矩阵的线性变化
  12. out_image = a*in_image + b
  13. # 数据类型的转化
  14. out_image = out_image.astype(np.uint8)
  15. # 显示原图和直方图正规化的效果
  16. cv2.imshow('IN', in_image)
  17. cv2.imshow('OUT', out_image)
  18. cv2.waitKey(0)
  19. cv2.destroyAllWindows()

  输出结果:

四: 伽马变化

python实现:

  1. # 伽马变换增强对比度
  2. in_image = cv2.imread('p2.jpg', cv2.IMREAD_GRAYSCALE)
  3. # 图像归一化
  4. fI = in_image/255.0
  5. # 伽马变化
  6. gamma = 0.5
  7. out_image = np.power(fI, gamma)
  8. # 显示原图和伽马变化后的效果
  9. cv2.imshow('IN', in_image)
  10. cv2.imshow('OUT', out_image)
  11. cv2.waitKey(0)
  12. cv2.destroyAllWindows()

结果输出:

五: 全局直方图均衡化

 

 

 Python代码实现:

  1. def calcGrayHist(image):
  2. '''
  3. 统计像素值
  4. :param image:
  5. :return:
  6. '''
  7. # 灰度图像的高,宽
  8. rows, cols = image.shape
  9. # 存储灰度直方图
  10. grayHist = np.zeros([256], np.uint64)
  11. for r in range(rows):
  12. for c in range(cols):
  13. grayHist[image[r][c]] += 1
  14. return grayHist
  15. # 全局直方图均衡化
  16. def equalHist(image):
  17. # 灰度图像矩阵的高,宽
  18. rows, cols = image.shape
  19. # 第一步:计算灰度直方图
  20. grayHist = calcGrayHist(image)
  21. # 第二步:计算累加灰度直方图
  22. zeroCumuMoment = np.zeros([256], np.uint32)
  23. for p in range(256):
  24. if p == 0:
  25. zeroCumuMoment[0] = grayHist[0]
  26. else:
  27. zeroCumuMoment[p] = zeroCumuMoment[p-1]+grayHist[p]
  28. # 第三步:根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系
  29. output_q = np.zeros([256], np.uint8)
  30. cofficient = 256.0 / (rows*cols)
  31. for p in range(256):
  32. q = cofficient * float(zeroCumuMoment[p]) - 1
  33. if q >= 0:
  34. output_q[p] = math.floor(q)
  35. else:
  36. output_q[p] = 0
  37. # 第四步:得到直方图均衡化后的图像
  38. equalHistImage = np.zeros(image.shape, np.uint8)
  39. for r in range(rows):
  40. for c in range(cols):
  41. equalHistImage[r][c] = output_q[image[r][c]]
  42. return equalHistImage
  43. image = cv2.imread('p2.jpg', cv2.IMREAD_GRAYSCALE)
  44. grayHist = equalHist(image)
  45. cv2.imshow('origin_image', image)
  46. cv2.imshow('equal_image', grayHist)
  47. cv2.waitKey(0)
  48. cv2.destroyAllWindows()

输出结果:

六: 限制对比度的自适应直方图均衡化

    Python代码:

  1. # 限制对比度的自适应直方图均衡化
  2. image = cv2.imread('p2.jpg', cv2.IMREAD_GRAYSCALE)
  3. # 创建ClAHE对象
  4. clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
  5. # 限制对比度的自适应阈值均衡化
  6. dst = clahe.apply(image)
  7. # 显示
  8. cv2.imshow('src', image)
  9. cv2.imshow('dst', dst)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()

输出结果:

 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号