【python】OpenCV—Histogram(9)

学习参考来自

更多学习笔记可以参考

文章目录

  • [1 直方图](#1 直方图)
  • [2 局部图片区域的直方图](#2 局部图片区域的直方图)
  • [3 全局直方图均衡化](#3 全局直方图均衡化)
  • [4 局部直方图均衡化](#4 局部直方图均衡化)

1 直方图

直方图可以清晰了解图像的整体灰度分布,先看看 opencv 中的接口

py 复制代码
cv2.calcHist()
- image输入图像,传入时应该用中括号[]括起来
- channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[]传入。
- mask:掩膜图像。如果统计整幅图,那么为none。主要是如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
- histSize:灰度级的个数,需要中括号,比如[256]
- ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。
py 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)  #直接读为灰度图像


# 法一:opencv方法读取-cv2.calcHist(速度最快)
hist_cv = cv2.calcHist([img], [0], None, [256], [0, 256])

# 法二:numpy方法读取-np.histogram()
hist_np, bins = np.histogram(img.ravel(), 256, [0, 256])

# 法三:numpy的另一种方法读取-np.bincount()(速度=10倍法2)
hist_np2 = np.bincount(img.ravel(), minlength=256)

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.plot(hist_cv), plt.title("cv2.calcHist")
plt.subplot(223), plt.plot(hist_np), plt.title("np.histogram")
plt.subplot(224), plt.plot(hist_np2), plt.title("np.bincount")
plt.show()

原图

不同接口计算得到的直方图

2 局部图片区域的直方图

加个 mask 对比看看

py 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
mask = np.zeros(img.shape[:2], np.uint8)
mask[25:185, 265:412] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.show()

蓝色是全图的,黄色是 mask 后的

3 全局直方图均衡化

直方图是对图像对比度效果上的一种处理,旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。

py 复制代码
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
res = cv2.equalizeHist(img)

plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(res, 'gray')
plt.show()

上述的直方图均衡化是一种全局意义上的均衡化

4 局部直方图均衡化

下面看看局部均衡化

py 复制代码
cv2. createCLAHE()
- clipLimit:颜色对比度的阈值,可选项,默认值 8
- titleGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值 (8,8)

消融下 titleGridSize, 10,20,50

py 复制代码
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
cl0 = cv2.createCLAHE(clipLimit=2, tileGridSize=(10, 10)).apply(img)
c20 = cv2.createCLAHE(clipLimit=2, tileGridSize=(20, 20)).apply(img)
c50 = cv2.createCLAHE(clipLimit=2, tileGridSize=(50, 50)).apply(img)

plt.subplot(221), plt.imshow(img, 'gray'), plt.title("ori")
plt.subplot(222), plt.imshow(cl0, 'gray'), plt.title("CLAHE 10")
plt.subplot(223), plt.imshow(c20, 'gray'), plt.title("CLAHE 20")
plt.subplot(224), plt.imshow(c50, 'gray'), plt.title("CLAHE 50")
plt.show()

消融下 clipLimit, 2, 4,6

py 复制代码
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
c2 = cv2.createCLAHE(clipLimit=2, tileGridSize=(10, 10)).apply(img)
c4 = cv2.createCLAHE(clipLimit=4, tileGridSize=(10, 10)).apply(img)
c6 = cv2.createCLAHE(clipLimit=6, tileGridSize=(10, 10)).apply(img)

plt.subplot(221), plt.imshow(img, 'gray'), plt.title("ori")
plt.subplot(222), plt.imshow(c2, 'gray'), plt.title("clipLimit 2")
plt.subplot(223), plt.imshow(c4, 'gray'), plt.title("clipLimit 4")
plt.subplot(224), plt.imshow(c6, 'gray'), plt.title("clipLimit 6")
plt.show()
相关推荐
东方佑5 分钟前
利用Python自动化处理PPT样式与结构:从提取到生成
python·自动化·powerpoint
橘猫云计算机设计30 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
超级小的大杯柠檬水43 分钟前
修改Anaconda中Jupyter Notebook默认工作路径的详细图文教程(Win 11)
ide·python·jupyter
2401_840192271 小时前
如何学习一门计算机技术
开发语言·git·python·devops
jndingxin1 小时前
OpenCV 图形API(11)对图像进行掩码操作的函数mask()
人工智能·opencv·计算机视觉
巷北夜未央1 小时前
Python每日一题(14)
开发语言·python·算法
大模型真好玩1 小时前
理论+代码一文带你深入浅出MCP:人工智能大模型与外部世界交互的革命性突破
人工智能·python·mcp
阳光_你好1 小时前
请详细说明opencv/c++对图片缩放
c++·opencv·计算机视觉
契合qht53_shine2 小时前
OpenCV 从入门到精通(day_05)
人工智能·opencv·计算机视觉
呵呵哒( ̄▽ ̄)"2 小时前
线性代数:同解(1)
python·线性代数·机器学习