其他分享
首页 > 其他分享> > 030-OpenCV直方图均衡化、自适应均衡化

030-OpenCV直方图均衡化、自适应均衡化

作者:互联网

话不多说,上代码,看结果。


import cv2  # 导入库
import numpy as np
from matplotlib import pyplot as plt

'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('19.jpg', 0)
'''
cv2.namedWindow(winname,flags)
#  winname是窗口名字
#  flags为窗口显示方式,cv2.WINDOW_NORMAL为正常显示,可以调整大小
# cv2.WINDOW_AUTOSIZE显示原图片的大小,用户不能调整大小
'''
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)


'''
    cv2.equalizeHist(src, dst)
    直方图均衡化
# src 输入图像, Mat类对象即可, 需为8位单通道图像
# dst 均衡化后结果图像, 需和原图一样的尺寸和类型
'''
img1 = cv2.equalizeHist(img)
'''
两个拼接数组的方法:
np.vstack():在竖直方向上堆叠
np.hstack():在水平方向上平铺
'''
img2 = np.hstack((img, img1))  # 将2张图片合并一起
'''
    cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)
    计算直方图!!!! 不是画出来!!!1
# images:输入的图像
# channels:选择图像的通道
# mask:掩码,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像
# histSize:使用多少个bin(柱子),一般为256
# ranges:像素值的范围,一般为[0,255]表示0~255

# hist: 输出的目标直方图
# accumulate: 累计标识符, 默认值false, 若为true, 直方图在配置阶段不会被清零
'''
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
'''
# plt.hist(src,pixels)
# src:数据源,注意这里只能传入一维数组,使用src.ravel()可以将二维图像拉平为一维数组。
# pixels:像素级,一般输入256。
# [0, 256] 直方图连在了一起,不输入就是一个个柱子
'''
plt.hist(img.ravel(), 256, [0, 256])

hist = cv2.calcHist([img1], [0], None, [256], [0, 256])
plt.hist(img1.ravel(), 256, [0, 256])
plt.show()

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图,均衡化嘛,平均一下…
在这里插入图片描述
接下来是直方图自适应均衡化。


import cv2  # 导入库
import numpy as np
from matplotlib import pyplot as plt

'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('19.jpg', 0)
'''
cv2.namedWindow(winname,flags)
#  winname是窗口名字
#  flags为窗口显示方式,cv2.WINDOW_NORMAL为正常显示,可以调整大小
# cv2.WINDOW_AUTOSIZE显示原图片的大小,用户不能调整大小
'''
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
'''
    cv2.createCLAHA(clipLimit=8.0, tileGridSize=(8, 8))  
    用于生成自适应均衡化图像
# clipLimit颜色对比度的阈值 
# tileGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
# 第一步:使用cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) 实例化均衡直方图函数
# 第二步:使用.apply进行均衡化操作
# 第三步:进行画图操作
'''
img1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(3, 3))
img1 = img1.apply(img)
'''
    cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)
    计算直方图!!!! 不是画出来!!!1
# images:输入的图像
# channels:选择图像的通道
# mask:掩码,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像
# histSize:使用多少个bin(柱子),一般为256
# ranges:像素值的范围,一般为[0,255]表示0~255

# hist: 输出的目标直方图
# accumulate: 累计标识符, 默认值false, 若为true, 直方图在配置阶段不会被清零
'''
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
'''
# plt.hist(src,pixels)
# src:数据源,注意这里只能传入一维数组,使用src.ravel()可以将二维图像拉平为一维数组。
# pixels:像素级,一般输入256。
# [0, 256] 直方图连在了一起,不输入就是一个个柱子
'''
plt.hist(img.ravel(), 256, [0, 256])

hist = cv2.calcHist([img1], [0], None, [256], [0, 256])
plt.hist(img1.ravel(), 256, [0, 256])

plt.show()
cv2.imshow('img1', img1)
'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图。
在这里插入图片描述
接下来是彩色图的自适应均衡化。


import cv2  # 导入库
import numpy as np
from matplotlib import pyplot as plt
'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('19.jpg')
'''
cv2.namedWindow(winname,flags)
#  winname是窗口名字
#  flags为窗口显示方式,cv2.WINDOW_NORMAL为正常显示,可以调整大小
# cv2.WINDOW_AUTOSIZE显示原图片的大小,用户不能调整大小
'''
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)

b, g, r = cv2.split(img)
'''
    cv2.createCLAHA(clipLimit=8.0, tileGridSize=(8, 8))  
    用于生成自适应均衡化图像
# clipLimit颜色对比度的阈值 
# tileGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
# 第一步:使用cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) 实例化均衡直方图函数
# 第二步:使用.apply进行均衡化操作
# 第三步:进行画图操作
'''
img1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(3, 3))
b = img1.apply(b)
r = img1.apply(g)
g = img1.apply(r)
img2 = cv2.merge([b, g, r])

mask = np.zeros(img.shape[:2], np.uint8)
mask[130:327, 158:473] = 255
color = ('b', 'g', 'r')     # <class 'tuple'>  元组类型
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
# 同时列出数据和数据下标,一般用在 for 循环当中。
for i, col in enumerate(color):
    hist1 = cv2.calcHist([img], [i], mask, [256], [0, 256])
    plt.plot(hist1, color=col)
    hist2 = cv2.calcHist([img2], [i], mask, [256], [0, 256])
    '''
    # plt.plot()函数是matplotlib.pyplot模块下的一个函数, 用于画图
        plt.plot(x, y, "格式控制字符串")
    # "格式控制字符串"最多可以包括三部分, "颜色", "点型", "线型"
    '''
    plt.plot(hist2, color=col)
    '''
        设置x轴的数值显示范围
    # plt.xlim(xmin, xmax)
    # xmin:x轴上的最小值
    # xmax:x轴上的最大值
    # 上面的函数功能,调用签名和参数说明同样可以平移到函数ylim()上。
    '''
    plt.xlim([0, 256])
plt.show()
cv2.imshow('img2', img2)
'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图。
在这里插入图片描述
在这里插入图片描述
就先这样,遇到别的再补充。

标签:plt,img,均衡化,cv2,OpenCV,直方图,winname,img1,256
来源: https://blog.csdn.net/weixin_48013634/article/details/122750359