python图像灰度直方图统计及显示(原图像,线性拉伸后图像)

框架构建

①先导入图像;

②把图像转为矩阵形式储存;

③然后通过函数调用,拿到图像灰度的最大和最小值;

④对图像进行处理,使用公式:

python图像灰度直方图统计及显示(原图像,线性拉伸后图像)_第1张图片

⑤把拉伸之后的矩阵转换为图像;

⑥求取的直方图;

⑦显示图片及拉伸之后的原图和RGB三个通道的直方图。

总代码

# 图像线性拉伸
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False# 显示负号
# 默认的像素:[6.0,4.0],分辨率为100,图片尺寸为 600&400
# 指定dpi=200,图片尺寸为 1200*800;# 指定dpi=300,图片尺寸为 1800*1200
# 设置figsize可以在不改变分辨率情况下改变比例
plt.rcParams['figure.dpi'] = 200 #分辨率

#图像位置: D:/桌面 C盘移过来/数字图像处理实习/数字图像处理彩色图像.jpg
filename = input('图像路径:')
image = Image.open(filename)

# 图片转为矩阵
image_array = np.array(image)

# 拉伸到最大、最小值
stretch_max= int(input('拉伸到最大值maximum:'))
stretch_min= eval(input('拉伸到最小值minimum:'))
# 原图的最大、最小值
max = np.max(image_array)
min = np.min(image_array)

b = image_array.shape

for i in range(b[2]):
    for m in range(b[1]):
        for n in range(b[0]):
            image_array[n, m, i] = (image_array[n, m, i] - min) / (max - min) * (stretch_max - stretch_min) + stretch_min
#最后的图像 把矩阵转为图
final_image = Image.fromarray(image_array)
R, G, B = final_image.split()

# 并排显示图片及拉伸之后的直方图
def ShowImageAndHist(filename):
    image = plt.imread(filename)#打开指定图片
    print(image.shape)

    plt.figure(figsize =(70,35),dpi=100)#定义图片框
    plt.subplot(4,2,1) # 将画板分为4行两列
    plt.title("原图")
    plt.imshow(image)#图片显示原始图像
    plt.colorbar(shrink=0.75) #颜色条
    im_r = image[:, :, 0]  # r通道
    im_g = image[:, :, 1]  # g通道
    im_b = image[:, :, 2]  # b通道

    plt.subplot(4,2,2)
    plt.title("拉伸图像")

    plt.imshow(final_image)


    plt.subplot(4,2,3)
    plt.title("原图r")
    plt.hist(im_r, facecolor='g',edgecolor='g')
    plt.xlabel('Value')
    plt.ylabel('Frequency')

    plt.subplot(4, 2, 4)
    plt.title("原图g")
    plt.hist(im_g, facecolor='g',edgecolor='g')
    plt.xlabel('Value')
    plt.ylabel('Frequency')

    plt.subplot(4, 2, 5)
    plt.title("原图b")
    plt.hist(im_b, facecolor='g',edgecolor='g')
    plt.xlabel('Value')
    plt.ylabel('Frequency')


    plt.subplot(4, 2, 6)
    plt.title("拉伸图R")
    plt.bar(range(256), R.histogram())
    plt.xlabel('Value')
    plt.ylabel('Frequency')

    plt.subplot(4, 2, 7)
    plt.title("拉伸图G")
    plt.bar(range(256), G.histogram())
    plt.xlabel('Value')
    plt.ylabel('Frequency')

    plt.subplot(4, 2, 8)
    plt.title("拉伸图B")
    plt.bar(range(256), B.histogram())
    plt.xlabel('Value')
    plt.ylabel('Frequency')

    plt.show()#窗口中展示图片


if __name__ == '__main__':

    # filename = r'D:/桌面 C盘移过来/数字图像处理实习(已完成)/数字图像处理彩色图像.jpg'
    ShowImageAndHist(filename)

实践结果

可以输入相对或者绝对路径,然后输入想到拉伸的数值范围,会显示图片大小和通道数。原始图像、拉伸后的图像以及三通道的直方图显示结果如下: 

python图像灰度直方图统计及显示(原图像,线性拉伸后图像)_第2张图片

python图像灰度直方图统计及显示(原图像,线性拉伸后图像)_第3张图片

python图像灰度直方图统计及显示(原图像,线性拉伸后图像)_第4张图片

python图像灰度直方图统计及显示(原图像,线性拉伸后图像)_第5张图片

 

 

 

你可能感兴趣的:(计算机视觉,图像处理,opencv,python,开发语言)