hellou

opencv学习笔记(十)

图像中的直方图:
hist = cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
  • images:输入的图像,可以是单张图像或图像列表。在函数中需要用中括号 【】,且原图像格式应该是uint8或者floa32
  • channels:指定要计算直方图的通道索引,对于灰度图像为 [0],对于彩色图像可以指定 [0][1][2] 分别代表蓝色、绿色和红色通道,即对应。
  • mask:可选参数,用于指定要计算直方图的区域,如果不指定或者None则计算整个图像的直方图。
  • histSize:指定直方图的大小,可以是一个整数或一个整数列表,表示每个通道的直方图的 bin 数量,也用【】括起来。
  • ranges:指定直方图的范围,通常为 [0, 256],表示像素值的范围。


ravel() 是 NumPy 数组对象的一个方法,用于将多维数组转换为一维数组。它返回一个视图,而不是创建新的数据副本。

plt.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, color=None, label=None, stacked=False, *, data=None, **kwargs)

  • x:输入的一维数据数组,用于绘制直方图。
  • bins:直方图的 bin(箱)的数量或定义的 bin 边界。默认为 None,表示自动计算 bin 数量。
  • range:直方图的范围。默认为 None,表示使用数据的范围。
  • density:是否将直方图归一化为概率密度。默认为 False
  • weights:用于指定每个数据点的权重。默认为 None
  • cumulative:是否绘制累积直方图。默认为 False

其他参数用于设置直方图的样式、颜色、标签等。

#图像直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('C:/Users/hellou/Desktop/beautiful.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])

plt.hist(img.ravel(),256)
"""ravel()方法介绍:不论矩阵的维度是多少。使用ravel()可以让矩阵统统变为一维数组
调用方法:plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)
参数说明:

    bottom:可以为直方图的每个条形添加基准线,默认为0;
    histtype:指定直方图的类型,默认为bar,除此还有’barstacked’, ‘step’, ‘stepfilled’;
    align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’;
    orientation:设置直方图的摆放方向,默认为垂直方向;
    rwidth:设置直方图条形宽度的百分比;
    log:是否需要对绘图数据进行log变换;
    color:设置直方图的填充色;
    label:设置直方图的标签,可通过legend展示其图例;
    stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放;
"""
plt.show()

color = ('b','g','r')
for i in enumerate(color):
    histr = cv2.calcHist([img],[0],None,[256],[0,256])
    plt.xlim([0,256])
    plt.show()

matplot统计的是rbg图像,而opencv统计的是bgr图像

均衡化原理:

在图像处理中,掩码(Mask)是一个二进制图像,用于指示某些区域的位置或选择。掩码图像与原始图像具有相同的大小,但只有在掩码中对应位置为 1 的像素才被视为有效或需要处理的像素。

使用掩码可以实现以下操作:

  1. 区域选择:通过将掩码中感兴趣的区域设置为白色(像素值为 255),其余区域设置为黑色(像素值为 0),可以选择图像中特定区域进行处理或分析。

  2. 掩码运算:通过将两个掩码图像进行逻辑运算,可以合并、相交或排除两个区域。例如,可以通过逻辑与运算(AND)来获取两个掩码中相交区域的结果。cv2.bitwise_and() 函数进行逻辑与运算,得到两个掩码的相交区域。使用 cv2.bitwise_or() 函数进行逻辑或运算,得到两个掩码的合并区域。使用 cv2.bitwise_not() 函数进行逻辑非运算,得到第一个掩码的补集。

  3. 遮罩操作:将掩码应用于原始图像,只保留掩码中为白色的像素,而将其他像素设置为透明或特定颜色,可以实现图像的遮罩效果。

直方图均衡化:

具体步骤如下

  1. 将彩色图像转换为灰度图像:如果原始图像是彩色图像,首先将其转换为灰度图像。

  2. 计算灰度直方图:计算灰度图像的直方图,即统计每个灰度级的像素数量。

  3. 计算累积直方图:计算灰度直方图的累积分布函数(CDF),表示小于或等于给定灰度级的像素的累积概率。

  4. 根据累积直方图进行像素映射:使用CDF对原始图像中的每个像素值进行映射,将像素值映射到新的灰度级。这可以通过线性插值或其他映射函数来实现。

  5. 创建均衡化后的图像:使用调整后的像素值创建均衡化后的图像。

#直方图均衡化
import cv2
import matplotlib.pyplot as plt
import numpy as np

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('C:/Users/hellou/Desktop/self-image.jpg', 0)
img = cv2.resize(img,(600,600))
plt.hist(img.ravel(), 256)
plt.show()

equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(), 256)
plt.show()

#均衡化处理后的区别
res = np.hstack((equ,img))
cv_show(res,"res")
"""因为整体平均了,所以会有部分细节进行丢失
进行分块均衡化处理,但是容易被噪音点干扰"""

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
res_clache = clahe.apply(img)
res = np.hstack((img, equ,res_clache))
cv_show(res,'res')

 

posted on 2023-06-24 17:07  云上u  阅读(62)  评论(0编辑  收藏  举报

导航