python中opencv图像处理实验(二)---直方图均衡

本次主要内容是直方图均衡化。主要分为三部分,灰度图像的归一化直方图、灰度图像直方图均衡处理和彩色图像直方图均衡处理。

直方图均衡化处理是图像处理领域中利用图像直方图对对比度进行调整的方法。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

总结就是是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分,对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。

1.灰度图像的归一化直方图

img=cv2.imread("gray.jpg",0)
hist=cv2.calcHist([img],[0],None,[256],[0,256])

直接调用opencv中直方图的函数calHist。

  • 第一个参数是images。读入的图片,需要用“[ ]”
  • 第二个参数是channels。通道数,这里是灰度图像使用[0]
  • 第三个参数是mask。掩膜,一般为None
  • 第四个参数是histSize。直方图大小,一般为灰度级
  • 第五个参数是ranges。直方图横轴的范围

         

2.灰度图像的均衡处理

#灰度图像均衡处理
eq=cv2.equalizeHist(img)#直方图均衡化
cv2.imshow("Histogram Equalization",np.hstack([img,eq]))

这里使用的均衡化也是直接采用函数调用equalizeHist,只包含一个imges参数。


3.彩色图像的均衡处理

src=cv2.imread("001.jpg")
#彩色图像直方图
colors=cv2.split(src)
colorsNys=("b","g","r")#分解为3个颜色元素

首先将彩色图像分解成三个颜色通道,然后在一个直方图中显示三种颜色

for(color,colorsNy) in zip(colors,colorsNys):
    hist=cv2.calcHist([color],[0],None,[256],[0,256])#对每种色彩绘制直方图
    plt.plot(hist,color=colorsNy)
    plt.xlim([0,256])
plt.show()

彩色图像的均衡处理,将图像颜色分解后可以按照灰度的累积分布函数处理和按各自颜色的分布函数处理。

  

完整代码如下:

1.灰度图像直方图与均衡处理

#!/usr/bin/env python
# encoding: utf-8

import cv2
from matplotlib import pyplot as plt
import numpy as np

src=cv2.imread("001.jpg")
img=cv2.imread("gray.jpg",0)

#灰度图像图像直方图
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()#新建图像
plt.title("Histogram")#图像标题
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0,256])
plt.show()

#灰度图像均衡处理
eq=cv2.equalizeHist(img)#直方图均衡化
cv2.imshow("Histogram Equalization",np.hstack([img,eq]))

cv2.waitKey(0)

2.彩色图片均衡处理

此处主要参考https://blog.csdn.net/bigcat133/article/details/41513677,有兴趣的同学可以查看详细内容。

#!/usr/bin/env python
# encoding: utf-8
from PIL import Image
from pylab import *
from scipy.misc import *

# 定义直方图均衡化函数,这里传入的参数是灰度图像的数组和累积分布函数值
def histImageArr(im_arr, cdf):
    cdf_min = cdf[0]
    im_w = len(im_arr[0])
    im_h = len(im_arr)
    im_num = im_w * im_h
    color_list = []
    i = 0

    # 通过累积分布函数计算灰度转换值
    while i < 256:
        if i > len(cdf) - 1:
            color_list.append(color_list[i - 1])
            break
        tmp_v = (cdf[i] - cdf_min) * 255 / (im_num - cdf_min)
        color_list.append(tmp_v)
        i += 1

    # 产生均衡化后的图像数据
    arr_im_hist = []
    for itemL in im_arr:
        tmp_line = []
        for item_p in itemL:
            tmp_line.append(color_list[item_p])
        arr_im_hist.append(tmp_line)

    return arr_im_hist

#读取图像
src=Image.open('001.jpg')
arr_rgb=array(src)
arr_rcolor=[]
arr_gcolor=[]
arr_bcolor=[]
i=0
#分离三色通道
for itemL in arr_rgb:
    arr_gcolor.append([])
    arr_rcolor.append([])
    arr_bcolor.append([])
    for itemC in itemL:
        arr_rcolor[i].append(itemC[0])
        arr_gcolor[i].append(itemC[1])
        arr_bcolor[i].append(itemC[2])
    i=i+1

#通过灰度图像的累积分布函数处理
im_gray=src.convert('L')
arr_gray=array(im_gray)
imhist,bins=histogram(arr_gray.flatten(),range(256))
cdf=imhist.cumsum()

arr_rcolor_hist=histImageArr(arr_rcolor,cdf)
arr_gcolor_hist=histImageArr(arr_gcolor,cdf)
arr_bcolor_hist=histImageArr(arr_bcolor,cdf)

#合并三色通道至图片
i=0
arr_hist=[]
for i in range(len(arr_rcolor_hist)):
    j=0
    tmp_line=[]
    for j in range(len(arr_rcolor_hist[i])):
        tmp_point=[arr_rcolor_hist[i][j],arr_gcolor_hist[i][j],arr_bcolor_hist[i][j]]
        tmp_line.append(tmp_point)
        j+=1
    arr_hist.append(tmp_line)
    i+=1

figure()
im_image=toimage(array(arr_hist),255)
im_image.save("colorHits.png","PNG")


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ywqqjw

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

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

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

打赏作者

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

抵扣说明:

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

余额充值