实验二 图像直方图及灰度变换(Python实现)

二、实验内容

  1. 编写一个图像灰度直方图统计函数 my_imhist,选择一幅图像利用 my_imhist 显示其直方图,将结果与 MATLAB 图像处理工具箱中提供的灰度直方图函数 imhist 的处理结果进行比较,并在同一窗口中显示出来。
  2. 利用以上编写的函数 my_imhist 或 imhist,估算图像 iris.tif 中瞳孔 的半径(以像素为单位)。
    实验二 图像直方图及灰度变换(Python实现)
    实验二 图像直方图及灰度变换(Python实现)

三、实验图像(可使用其他自选图像)

四、实验源程序及结果截图

首先,在Python脚本文件中导入以下库:

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv

如果cv2提示不存在则需要安装

1、编写一个图像灰度直方图统计函数 my_imhist,选择一幅图像利用 my_imhist 显示其直方图,将结果与 MATLAB 图像处理工具箱中提供的灰度直方图函数 imhist 的处理结果进行比较,并在同一窗口中显示出来。

def my_imhist(img):
"""
    根据图像绘制直方图
"""
    h, w = img.shape  # 获取图像的高与宽
    hist = [0] * 256  # 首先各灰度频数都置为0
    for i in range(h):
        for j in range(w):
            hist[img[i, j]] += 1
    return hist

src = cv.imread("eye.png", 0)  # 以灰度图像读入
img = src.copy()

plt.subplot(211)
plt.bar(range(256), my_imhist(img), width=1)
plt.title("自己绘制的直方图")
plt.subplot(212)
plt.hist(img.ravel(), 255, [0, 255])
plt.title("python库绘制的直方图")
plt.tight_layout()
plt.show()

实验二 图像直方图及灰度变换(Python实现)

2、利用以上编写的函数 my_imhist 或 imhist,估算图像 iris.tif 中瞳孔的半径(以像素为单位)。

src = cv.imread("eye.png", 0)  # 以灰度图像读入
img = src.copy()
找出最小像素值
myArray = np.array(my_imhist(img))
min_pixel = my_imhist(img)[np.argmax(myArray > 0)]  # 找到列表中第一个非0 的数
根据像素数量算出半径
h, w = img.shape
count = 0
for i in range(h * w):
    if img.ravel()[i] - min_pixel < 20:
        count += 1
print("&#x77B3;&#x5B54;&#x534A;&#x5F84;&#x4E3A;&#xFF1A;", np.sqrt(count / np.pi), "&#x4E2A;&#x50CF;&#x7D20;&#x503C;")

(my_imhist函数参照第一题)

3、按照教材 68 页上的公式(4.1.6)

编程实现图像的分段线性灰度变换

src = cv.imread("child.png", 0)
img = src.copy()
a, b, c, d, max_g = 100, 160, 30, 170, 220
h, w = img.shape
max_f = max(img.ravel())
for i in range(h):
    for j in range(w):
        if 0 <= img[i, j] < a: a * if b: - c) (b a)) (img[i, a) + c b max_f: d) (max_f b)) b) d plt.subplot(121) plt.title("原图") plt.imshow(src, cmap="plt.cm.gray)" plt.subplot(122) plt.title("灰度变换后图像") plt.imshow(img, plt.show()< code></=>

实验二 图像直方图及灰度变换(Python实现)

4、编写一个灰度图像的直方图均衡化函数(不可使用库函数)。(可使用的灰度等级数量不变即可),并对下图例题进行测试,给出测试结果。

my_data = np.loadtxt("data.txt")
print(np.array(my_data))
bins = 8

n = my_data.shape[0]
r_k = list(range(0, bins))
n_k = [0] * bins
p_r = []
s_k_&#x8BA1; = []
s_k_&#x5E76; = [0] * bins
new = [[0 for col in range(n)] for row in range(n)]

for i in range(n * n):
    n_k[int(my_data.ravel()[i])] += 1
for i in range(bins):
    p_r.append(round(n_k[i] / (n * n), 4))
for i in range(bins):
    s_k_&#x8BA1;.append(round(sum(p_r[:(i + 1)]), 4))

temp = []
for i in range(bins):
    temp.append(round(i / n, 4))
for i in range(len(s_k_&#x8BA1;)):
    minSub = 1
    for j in range(len(s_k_&#x8BA1;)):
        sub = abs(s_k_&#x8BA1;[i] - temp[j])
        if sub < minSub:
            minSub = sub
            s_k_&#x5E76;[i] = j

for i in range(n):
    for j in range(n):
        new[i][j] = s_k_&#x5E76;[int(my_data[i][j])]
print('&#x5747;&#x8861;&#x5316;&#x540E;&#x7684;&#x77E9;&#x9635;&#xFF1A;\n', np.array(new))

实验二 图像直方图及灰度变换(Python实现)

注:data.txt文件按照此格式输入即可,或者直接将矩阵写进代码

实验二 图像直方图及灰度变换(Python实现)

注:

1.官方绘制的直方图也可以直接使用 cv2 中的函数 calHist() ,详见文章:

实验二 图像直方图及灰度变换(Python实现)

结果图为:

实验二 图像直方图及灰度变换(Python实现)

Original: https://blog.csdn.net/qq_45832961/article/details/124000854
Author: ReadyGo!!!
Title: 实验二 图像直方图及灰度变换(Python实现)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/636659/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球