数字图像处理编程基础:Python语言不调用OpenCV函数实现直方图统计和直方图均衡

Python语言不调用OpenCV函数实现均值滤波

  • 编译环境
    • 前提
    • 代码
    • 运行结果
    • 目的

编译环境

由于编程语言选择Python,所以博主用的编译器为PyCharm 2017

前提

我们在学了冈萨雷斯的数字图像处理(第三版)之后,了解到里面涉及到直方图处理(P72),首先对一副图像需要先进行直方图统计,统计工作完成之后,再进行直方图均衡,为锻炼编程能力,这里不调用opencv中的函数直接进行,而是自己写统计函数,写均衡化函数。
需要用到plt的绘图功能,PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。 PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。

代码

代码如下:

import cv2
from pylab import *

def zhifangtu1(Image):                  #灰度图像直方图统计
    im=Image
    a=[0]*256                           #构造储存像素数的一维数组
    w=im.shape[0]                       #得到图像的宽高
    h=im.shape[1]
    for i in range(w):                  #遍历所有像素点统计
        for j in range(h):
            gray=im[i,j]
            a[gray]+=1
    y=a                                 #y表示灰度值的像素个数
    x = [i for i in range(256)]         #x表示0-256的灰度
    figure()
    plt.title('zhifangtutongji')
    plt.xlabel('Bins')
    plt.ylabel('Pixels')
    plt.bar(x,y)
    plt.xlim([0,256])
    figure()
    plt.imshow(Image)
    return a                            #返回灰度像素数

def junhenghua(a,Image):                #均衡化函数:a--灰度像素数,Image--图片
    im=array(Image)
    b=[0]*256                           #储存灰度像素所占的比例
    c=[0]*256                           #储存累计分布概率
    w=im.shape[0]                       #图像的宽和高
    h=im.shape[1]
    mn=w*h                              #mn表示像素点总数
    for i in range(len(a)):             #计算灰度分布密度
        b[i]=a[i]/mn
    for i in range(len(c)):             #计算累计分布密度c和累计直方图数据a
        if i==1:
            c[i]=b[i]
        else:
            c[i]=c[i-1]+b[i]
            a[i]=int(255*c[i])
    for i in range(w):                  #更新每一个像素点的灰度值
        for j in range(h):
            im[i,j]=a[Image[i,j]]
    return im
im=cv2.imread('jiang.jpg',0)
a=zhifangtu1(im)
im1=junhenghua(a,im)
zhifangtu1(im1)
cv2.imshow('Origin',im)
cv2.imshow('junhenghua',im1)
plt.show()

运行结果

处理前的直方图统计:
数字图像处理编程基础:Python语言不调用OpenCV函数实现直方图统计和直方图均衡_第1张图片
处理后的直方图统计:
数字图像处理编程基础:Python语言不调用OpenCV函数实现直方图统计和直方图均衡_第2张图片
处理前后图片对比:
数字图像处理编程基础:Python语言不调用OpenCV函数实现直方图统计和直方图均衡_第3张图片

目的

充分锻炼自己的编程水平,并且自己动手对直方图均衡这一处理方式有了更深的理解,对图像的内涵也有了深层次的理解。

你可能感兴趣的:(直方图均衡)