计算机视觉实验之直方图均衡化和对数变换

这篇简单的文章主要是针对我们老师布置的实验作业做的一些简单总结。不足之处,请指正。

1.实验题目

1.1 直方图均衡化

1.2对数变换

2.实验内容

2.1 直方图均衡化

2.1.1 实验目的

利用图像直方图对对比度进行调整的方法,使得变换后的图像直方图均匀分布,增加了图像的全局对比度,图像也就越清晰,色彩也就越丰富。

2.1.2 实验步骤

n  统计灰度直方图

n  求出对应的概率密度

n  求对应的累积概率

n  求出每个灰度级对应的输出灰度级

n  映射到新的图像

2.1.3 实现代码

 import numpy as np

#import cv2
from PIL import Image
from pylab import *
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif']=['SimHei']
def grayhis(img):
    a = [0]*256            #存储图像的灰度值像素
    sum_all=row*column
    for i in range(row):
        for j in range(column):
            gray = img[i][j]
          #  print(gray)
            a[gray]+= 1       #计算不同灰度值的频数
          # sum_all+=a[gray]
    #print(a)
    print("总数为:",sum_all)
    x=[i for i in range(256)]
    y=a
    plt.figure()
    plt.title("图像像素直方图")
    plt.xlabel("频数")
    plt.ylabel("像素")
    plt.plot(x,y)
    plt.xlim([0,256])
    return sum_all,a
def equalization(a,img,sum_all):
    b=[0]*256 #对应的频率密度
    c=[0]*256 #对应的累计密度转换得到的灰度值数组
    for i in range(0,256):
        b[i]=a[i]/sum_all
        print("值为:",b[i])
    for i in range(0,256):
        for j in range(i):
            c[i] +=b[j]
        c[i]=c[i]*255
        print("映射所得灰度:",c[i])
    #映射后的灰度值向上取整
    for i in range(row):
        for j in range(column):
            img[i][j]=int(c[img[i][j]])
    return img
img=Image.open("mountain.jpg")
img=np.array(img)
print(type(img))
print(img)
row, column = img.shape[0], img.shape[1]
print(row, column)
sum_all,a=grayhis(img)
plt.figure()
plt.imshow(img,cmap='gray')
plt.show()
img1=equalization(a,img,sum_all)
plt.imshow(img1,cmap='gray')
plt.show()

2.1.4 结果展示

l  原图

 

l  直方图均衡化后

 

2.2 对数变换

2.2.1 实验目的

对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节;将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。对数变换对于整体对比度偏低、灰度值偏低的图像增强效果较好。

2.2.2 实验步骤

利用变换公式  调整图像每个像素点的灰度值。

2.2.3 实现代码

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import math
img=Image.open("city.jpeg")
img=np.array(img)
print(type(img))
print(img)
c=255/np.log(256)
row, column = img.shape[0], img.shape[1]
print(row, column)
plt.figure()
plt.imshow(img,cmap='gray')
plt.show()

for i in range(row):
    for j in range(column):
        img[i][j]=c*np.log(1+img[i][j])
plt.imshow(img,cmap='gray')
plt.show()

2.2.4 结果展示

l  原图

l  对数变换后

猜你喜欢

转载自www.cnblogs.com/ManbaDF99/p/10666284.html
今日推荐