数字图像处理实验一 直方图均衡化与直方图规定化

数字图像处理-直方图均衡化与直方图规定化


前言

本数字图像处理的学习系列是对课本知识的实现,完成课程相关的实验部分。


题目描述

熟练掌握直方图均衡化和直方图规定化的计算过程。

基本概念

  1. 直方图是多种空间域处理技术的基础。直方图操作可用于图像增强。
    归一化直方图:简单来说就是求估计概率,即每像素的个数除以总像素数。总概率为1.

  2. 掩膜:是用选定的图像、图形或物体,对要处理的图片进行遮挡,来控制图片处理的区域。通常使用二维矩阵进行掩膜,掩膜有0,1组成的二进制图像。
    掩膜的用途:提取感兴趣区域、屏蔽作用、结构特征提取、特殊形状图像制作

  3. 直方图均衡化:将一副倾向于占据一小部分可能的灰度级并且像素分布不均匀的图像变成一副占据整个可能的灰度级并且分布均匀的图像。这样做的目的是让该图像具有高对比度的外观并展示灰色调的较大变化。广泛用于X光中。
    直方图均衡化原理:灰度级变换函数,变换函数不改变前后灰度级的范围并且产生均匀直方图的图像。变换函数用于直方图均衡化而反变换用于直方图匹配。
    自适应的直方图均衡化:效果更佳,将整幅图像分为很多小块,然后对每一个小块分别进行直方图均衡化,最后使用双线性差值形式(为了去除边界)进行拼接。
    思考并区分:暗图像、亮图像、低对比度图像、高对比度图像?灰度直方图 or 彩色直方图?
    问题思考:关键点是均匀,如何确定变换函数?如何有效证明变换后的各灰度级的概率均匀?

  4. 直方图规定化:用于产生处理后有特殊直方图形状的方法。
    直方图规定化原理:灰度级的反变换

学习目标

1.掌握图像的直方图计算和显示
2.了解掩膜的应用
3.熟悉直方图均衡化,了解自适应的直方图均衡化
4.熟悉直方图规定化

代码实现

"""
    # -*- coding :utf-8 -*-
    # @Time:2022/3/129:05
    # @Author:WEIKETAN
    # @File:equalizeHIst.py
    # @Desc:灰度直方图、直方图均衡化、掩膜的应用,直方图规定化(TODO)
"""
import matplotlib
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

""" 1.draw and show grayscale_image"""
def dsGrayscaleimage():
    # 1.read grayscale_image directly
    """
    imread(imgpath, 0)
    :param
        imgpath
        gray or RGB: default RGB、 gray -- 0
    :return:the image arrays
    """
    img = cv.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\cat.jpeg", 0)
    plt.imshow(img, cmap=plt.cm.gray)  # default--热图(heatmap)、 another show_style: cv.imshow("grayImg",img)

    # 2.calculate grayscale_image
    """
    cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])
    :param
        images:raw images eg:[img]
        channels:number [0]--grayImage [0][1][2]--BGR(26 letter order)
        mask:local or globel  default:globel(None)
        histSize:the number of BIN(直条或组距) eg:[256]
        ranges:the range of pixel eg:[0,255]
    :return:the histr arrays
    """
    histr = cv.calcHist([img], [0], None, [256], [0, 255])
    # print(histr, histr.shape)

    # 3.draw grayImage
    """
    pyplot.figsize()
    :param 
        figsize : (float, float), default: :rc:`figure.figsize`
            Width, height in inches.
        dpi : float, default: :rc:`figure.dpi`
        The resolution of the figure in dots-per-inch.
    """
    plt.figure(figsize=(10, 6), dpi=100)
    plt.plot(histr)
    plt.show()

""" 2.mask_ROI(Region of interest):使用掩膜提取感兴趣区域"""
def mask_ROI():
    # 1. 直接以灰度图的方式读入
    img = cv.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\cat.jpeg", 0)
    # plt.imshow(img, cmap=plt.cm.gray)

    # 2. 创建膜板
    mask = np.zeros(img.shape[:2], np.uint8)  # 提取图片的长和宽
    mask[400:650, 200:500] = 1
    # plt.imshow(mask, cmap=plt.cm.gray)

    # 3. 掩膜后数据
    masked_img = cv.bitwise_and(img, img, mask=mask)
    # plt.imshow(masked_img, cmap=plt.cm.gray)

    # 4. 统计掩膜后图像的灰度图
    mask_histr = cv.calcHist([img], [0], mask, [256], [0, 255])

    # 5. 图像展示
    # 设置字体为楷体,解决显示字体乱码问题
    matplotlib.rcParams['font.sans-serif'] = ['KaiTi']

    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
    axes[0, 0].imshow(img, cmap=plt.cm.gray)
    axes[0, 0].set_title("原图")

    axes[0, 1].imshow(mask, cmap=plt.cm.gray)
    axes[0, 1].set_title("膜板数据")

    axes[1, 0].imshow(masked_img, cmap=plt.cm.gray)
    axes[1, 0].set_title("掩膜后数据")

    axes[1, 1].plot(mask_histr)
    axes[1, 1].grid()
    axes[1, 1].set_title('灰度直方图')
    plt.show()

""" 3.直方图均衡化"""
def equalizeHist():
    # 1. 读入图片
    img = cv.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\cat.jpeg", 0)
    # 2. 原图直方图
    histr = cv.calcHist([img], [0], None, [256], [0, 255])

    # 3. 均衡化处理
    dst = cv.equalizeHist(img)

    # 4. 均衡化后直方图
    histr1 = cv.calcHist([dst], [0], None, [256], [0, 255])


    # 4.  结果显示
    # 设置字体为楷体,解决显示字体乱码问题
    matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
    axes[0, 0].imshow(img, cmap=plt.cm.gray)
    axes[0, 0].set_title("原图")

    axes[0, 1].imshow(dst, cmap=plt.cm.gray)
    axes[0, 1].set_title("均衡化过的图片")

    axes[1, 0].plot(histr)
    axes[1, 0].set_title("原图直方图")

    axes[1, 1].plot(histr1)
    axes[1, 1].grid()
    axes[1, 1].set_title('均衡化直方图')
    plt.show()


""" 4.自适应的直方图均衡化"""
def selfAdaptionQqualizeHist():
    # 1. 读取图片
    img = cv.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\cat.jpeg", 0)

    # 2. 原图直方图
    histr = cv.calcHist([img], [0], None, [256], [0, 255])

    # 3. 创建一个自适应均衡化的对象,并应用于图像
    # clipLimit:对比度限制,默认为 40
    # tileGridSize:分块大小,默认为 8 * 8
    clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    cl1 = clahe.apply(img)

    # 4. 原图直方图
    histr1 = cv.calcHist([cl1], [0], None, [256], [0, 255])

    # 5. 图像显示
    # 设置字体为楷体,解决显示字体乱码问题
    matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
    axes[0, 0].imshow(img, cmap=plt.cm.gray)
    axes[0, 0].set_title("原图")

    axes[0, 1].imshow(cl1, cmap=plt.cm.gray)
    axes[0, 1].set_title("均衡化过的图片")

    axes[1, 0].plot(histr)
    axes[1, 0].set_title("原图直方图")

    axes[1, 1].plot(histr1)
    axes[1, 1].set_title('均衡化直方图')
    plt.show()


if __name__ == '__main__':
    # 1.灰度直方图计算和显示
    # dsGrayscaleimage()

    # 2.使用掩膜提取感兴趣区域
    # mask_ROI()

    # 3.直方图均衡化
    # equalizeHist()

    # 4. 自适应直方图均衡化
    selfAdaptionQqualizeHist()

    # 5.直方图规定化
    # todo

效果演示

1、灰度直方图计算和显示,调用dsGrayscaleimage函数后的结果
API: dsGrayscaleimage()
在这里插入图片描述
2.使用掩膜提取感兴趣区域
API: mask_ROI()
在这里插入图片描述
3.直方图均衡化(猫腿太暗,效果一般)
API: equalizeHist()
在这里插入图片描述
自适应的直方图均衡化
API: selfAdaptionQqualizeHist()
在这里插入图片描述
4.直方图规定化(没有函数库),暂时不做实现。

总结

1.图片展示的两种方式:cv.imshow()、plt.imshow()(默认为热图)
2.坑一解决:cv.calcHist([img], [0], None, [256], [0, 255])方法中的参数都需要使用中括号使其变成数据类型:[array([[data]], dtype=uint8)],例如使用[img]而不是img,否则结果有大问题。
3.坑二解决: # 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams[‘font.sans-serif’] = [‘KaiTi’]
4.使用matplotlib进行画图(一张或者多张)


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值