【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()
相关推荐
算法小白(真小白)3 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Eric.Lee20213 小时前
Paddle OCR 中英文检测识别 - python 实现
人工智能·opencv·计算机视觉·ocr检测
Chinese Red Guest3 小时前
python
开发语言·python·pygame
骑个小蜗牛4 小时前
Python 标准库:string——字符串操作
python
黄公子学安全6 小时前
Java的基础概念(一)
java·开发语言·python
程序员一诺6 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
小木_.7 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器