python库skimage 实现图像直方图全局均衡化局部均衡化

Posted 我坚信阳光灿烂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python库skimage 实现图像直方图全局均衡化局部均衡化相关的知识,希望对你有一定的参考价值。

函数

from skimage import exposure
from skimage.morphology import disk
from skimage.filters import rank
# Global equalize
img_rescale = exposure.equalize_hist(img)

# Local Equalization
selem = disk(30)
img_eq = rank.equalize(img, selem=selem)

实验:低对比度图像全局均衡化和局部均衡化

"""
============================
Local Histogram Equalization
============================

This example enhances an image with low contrast, using a method called *local
histogram equalization*, which spreads out the most frequent intensity values
in an image.

The equalized image has a roughly linear cumulative distribution function
for each pixel neighborhood.

The local version of the histogram equalization emphasized every local
graylevel variations.

"""
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

from skimage import data
from skimage.util.dtype import dtype_range
from skimage.util import img_as_ubyte
from skimage import exposure
from skimage.morphology import disk
from skimage.filters import rank


matplotlib.rcParams[‘font.size‘] = 9


def plot_img_and_hist(image, axes, bins=256):
    """Plot an image along with its histogram and cumulative histogram.

    """
    ax_img, ax_hist = axes
    # Make and return a second axes that shares the x-axis. 
    # The new axes will overlay ax (or the current axes if ax is None), and its ticks will be on the right.
    ax_cdf = ax_hist.twinx()

    # Display image
    ax_img.imshow(image, cmap=plt.cm.gray)
    ax_img.set_axis_off()

    # Display histogram
    ax_hist.hist(image.ravel(), bins=bins)
    # Change the ScalarFormatter used by default for linear axes.
    ax_hist.ticklabel_format(axis=‘y‘, style=‘scientific‘, scilimits=(0, 0))
    ax_hist.set_xlabel(‘Pixel intensity‘)

    xmin, xmax = dtype_range[image.dtype.type]
    ax_hist.set_xlim(xmin, xmax)

    # Display cumulative distribution
    img_cdf, bins = exposure.cumulative_distribution(image, bins)
    ax_cdf.plot(bins, img_cdf, ‘r‘)

    return ax_img, ax_hist, ax_cdf


# Load an example image
img = img_as_ubyte(data.moon())

# Global equalize
img_rescale = exposure.equalize_hist(img)

# Equalization
selem = disk(30)
img_eq = rank.equalize(img, selem=selem)


# Display results
fig = plt.figure(figsize=(8, 5))
axes = np.zeros((2, 3), dtype=np.object)
axes[0, 0] = plt.subplot(2, 3, 1)
axes[0, 1] = plt.subplot(2, 3, 2, sharex=axes[0, 0], sharey=axes[0, 0])
axes[0, 2] = plt.subplot(2, 3, 3, sharex=axes[0, 0], sharey=axes[0, 0])
axes[1, 0] = plt.subplot(2, 3, 4)
axes[1, 1] = plt.subplot(2, 3, 5)
axes[1, 2] = plt.subplot(2, 3, 6)

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img, axes[:, 0])
ax_img.set_title(‘Low contrast image‘)
ax_hist.set_ylabel(‘Number of pixels‘)

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_rescale, axes[:, 1])
ax_img.set_title(‘Global equalise‘)

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_eq, axes[:, 2])
ax_img.set_title(‘Local equalize‘)
ax_cdf.set_ylabel(‘Fraction of total intensity‘)


# prevent overlap of y-axis labels
fig.tight_layout()
plt.show()

实验结果

技术图片

以上是关于python库skimage 实现图像直方图全局均衡化局部均衡化的主要内容,如果未能解决你的问题,请参考以下文章

图像处理库Skimage安装与使用

Python 使用skimage实现求两幅图像之间的PSNR值

Python 使用skimage实现求两幅图像之间的PSNR值

python库skimage 绘制二值图像的凸壳(convex hull)

python的skimage库 图像色彩空间转换 RGB到灰度;RGB到HSV

python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波