第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波10 - 直方图处理 - 局部直方图处理

这里写目录标题

局部直方图处理

因为像素是由基于整个图像的灰度的变换函数修改的。这种全局性方法适合于整体增强,但当目的是增强图像中几个小区域的细节时,通常就会失败。这是因为在这些小区域中,像素的数量对计算全局变换的影响可以忽略。解决方法是设计基于像素邻域的灰度分布的变换函数。

# opencv实现的局部直方图处理
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0326(a)(embedded_square_noisy_512).tif', 0)
img_transform, _= my_calhist(img_ori)
# img_transform = cv2.equalizeHist(img_ori)

plt.figure(figsize=(15, 6))
plt.subplot(1, 3, 1), plt.imshow(img_ori, cmap='gray', vmin=0, vmax=255), plt.title('Original')
plt.subplot(1, 3, 2), plt.imshow(img_transform, cmap='gray', vmin=0, vmax=255), plt.title(f'Global Equalize Hist')

clahe = cv2.createCLAHE(clipLimit=255, tileGridSize=(3, 3))
img_transform = clahe.apply(img_ori)

plt.subplot(1, 3, 3), plt.imshow(img_transform, cmap='gray', vmin=0, vmax=255), plt.title(f'Local Equalize Hist')
plt.tight_layout()
plt.show()

在这里插入图片描述

def my_calhist_local(img):
    """
    histogram equalization
    param: input img: uint8[0, 255] grayscale image
    return uint8[0, 255] grayscale image after histogram equalization
    """
#     hist, bins = my_hist(img, bins=256, normalized=True)  #局部直方图的时候这个比较慢,改为了下面的Numpy,效果快好多
    hist, bins = np.histogram(img, bins=256, range=[0, 256], density=True)

#--------------------------------Numpy-------------------
    hist_cumsum = np.round(np.cumsum(hist) * 255).astype(int)
    img_dst = hist_cumsum[img]
    return img_dst

def local_calhist(img_ori, grid_size=(3, 3)):
    """
    Local histogram equalization
    param: input img_ori: input uint8[0, 255] grayscale image
    param: input grid_size: grid size of the local hist, size need to be uneven number like 1, 3, 5
    return local histogram equalization of image uint8[0, 255]
    """
    height, width = img_ori.shape
    img_dst = img_ori.copy()
    m = grid_size[0]
    n = grid_size[1]
    padding_h = int((m - 1) / 2)
    padding_w = int((n - 1) / 2)
    img_pad = np.pad(img_ori.copy(), (padding_h, padding_w), mode='constant', constant_values=0)
    for h in range(padding_h, height + padding_h):
        for w in range(padding_w, width + padding_w):
            temp = my_calhist_local(img_pad[h-padding_h:h+padding_h+1, w-padding_w:w+padding_w+1])
            img_dst[h:h+1, w:w+1] = temp[padding_h, padding_w]
    return img_dst
# Numpy实现的局部直方图处理,效果比opencv好
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0326(a)(embedded_square_noisy_512).tif', 0)

# global histogram equalization
img_global = my_calhist_local(img_ori)

# local histogram equalization
img_local = local_calhist(img_ori, grid_size=(3, 3))

plt.figure(figsize=(15, 6))
plt.subplot(1, 3, 1), plt.imshow(img_ori, cmap='gray', vmin=0, vmax=255), plt.title('Original')
plt.subplot(1, 3, 2), plt.imshow(img_global, cmap='gray', vmin=0, vmax=255), plt.title(f'Global Equalize Hist')
plt.subplot(1, 3, 3), plt.imshow(img_local, cmap='gray', vmin=0, vmax=255), plt.title(f'Local Equalize Hist')
plt.tight_layout()
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jasneik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值