ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-30 10:30:42  阅读:201  来源: 互联网

标签:plt img 均衡化 cv2 OpenCV 直方图 winname img1 256


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


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有