数字图像处理期末代码


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


def highPassFiltering(img, size):  # 传递参数为傅里叶变换后的频谱图和滤波尺寸
    h, w = img.shape[0:2]  # 获取图像属性
    h1, w1 = int(h / 2), int(w / 2)  # 找到傅里叶频谱图的中心点
    img[h1 - int(size / 2):h1 + int(size / 2),
    w1 - int(size / 2):w1 + int(size / 2)] = 0  # 中心点加减滤波尺寸的一半,刚好形成一个定义尺寸的滤波大小,然后设置为0
    return img


# 初始图像
img1 = cv2.imread('photo.JPG')
# 直方图规定化基础图像
img2 = cv2.imread('cankao.png')

# img1初始RGB图像转HSV图像
img_hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
# img_hsv1(HSV图像)再转回初始RGB图像
hsv_img2 = cv2.cvtColor(img_hsv1, cv2.COLOR_HSV2BGR)
img_hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)

color = ('h', 's', 'v')

for i, col in enumerate(color):
    # histr = cv2.calcHist([img_hsv1], [i], None, [256], [0, 256])
    # ravel变为一维数组
    # img_hsv1[:, :, i].ravel()待统计数组,256表示表示统计范围的最小值和最大值,
    hist1, bins = np.histogram(img_hsv1[:, :, i].ravel(), 256, [0, 256])

    hist2, bins = np.histogram(img_hsv2[:, :, i].ravel(), 256, [0, 256])
    cdf1 = hist1.cumsum()  # 灰度值0-255的累计值数组
    cdf2 = hist2.cumsum()
    cdf1_hist = hist1.cumsum() / cdf1.max()  # 灰度值的累计值的比率
    cdf2_hist = hist2.cumsum() / cdf2.max()

    diff_cdf = [[0 for j in range(256)] for k in range(256)]  # diff_cdf 里是每2个灰度值比率间的差值
    for j in range(256):
        for k in range(256):
            diff_cdf[j][k] = abs(cdf1_hist[j] - cdf2_hist[k])

    lut = [0 for j in range(256)]  # 映射表
    for j in range(256):
        min = diff_cdf[j][0]
        index = 0
        for k in range(256):  # 直方图规定化的映射原理
            if min > diff_cdf[j][k]:
                min = diff_cdf[j][k]
                index = k
        lut[j] = ([j, index])
    # print(lut)

    h = int(img_hsv1.shape[0])
    w = int(img_hsv1.shape[1])
    for j in range(h):  # 对原图像进行灰度值的映射
        for k in range(w):
            # print(img_hsv1[j, k, i])
            # print(lut[img_hsv1[j, k, i]][1])
            img_hsv1[j, k, i] = lut[img_hsv1[j, k, i]][1]

hsv_img1 = cv2.cvtColor(img_hsv1, cv2.COLOR_HSV2BGR)  # hsv转bgr

# 转换为灰度图
image_gray = cv2.cvtColor(img_hsv1, cv2.COLOR_BGR2GRAY)
# Numpy库的傅里叶变换

# 傅里叶变换
f = np.fft.fft2(image_gray)
# 将左上角低频部分移动到中间
fshift = np.fft.fftshift(f)
# 调用高通滤波函数
img12 = highPassFiltering(fshift, 900)
# 复数化整,方便观察频谱图
res = np.log(np.abs(img12))
# 傅里叶逆变换
ishift = np.fft.ifftshift(img12)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)



output1 = iimg.astype(np.uint8)  # python类型转换
image11 = cv2.cvtColor(output1, cv2.COLOR_GRAY2BGR)
iimage_color = cv2.applyColorMap(output1, cv2.COLORMAP_JET)

cv2.namedWindow('origin_RGB_image', 0)
cv2.resizeWindow('origin_RGB_image', 1270, 900)

cv2.namedWindow('histogram_base_RGB_image', 0)
cv2.resizeWindow('histogram_base_RGB_image', 1270, 900)

cv2.namedWindow('origin_RGB_image_to_HSV', 0)
cv2.resizeWindow('origin_RGB_image_to_HSV', 1270, 900)

cv2.namedWindow('origin_HSV_to_rgb', 0)
cv2.resizeWindow('origin_HSV_to_rgb', 1270, 900)

cv2.namedWindow('origin_RGB_image_to_HSV_histogram_to_RGB', 0)
cv2.resizeWindow('origin_RGB_image_to_HSV_histogram_to_RGB', 1270, 900)

cv2.namedWindow('HSV_histogram_to_gray', 0)
cv2.resizeWindow('HSV_histogram_to_gray', 1270, 900)

cv2.namedWindow('gray_HSV_histogram_to_highPassFiltering', 0)
cv2.resizeWindow('gray_HSV_histogram_to_highPassFiltering', 1270, 900)

cv2.namedWindow('gray_HSV_histogram_to_highPassFiltering_to_RGB', 0)
cv2.resizeWindow('gray_HSV_histogram_to_highPassFiltering_to_RGB', 1270, 900)

cv2.imshow('origin_RGB_image', img1)
cv2.imshow('histogram_base_RGB_image', img2)
cv2.imshow('origin_RGB_image_to_HSV', img_hsv1)
cv2.imshow('origin_HSV_to_rgb', hsv_img2)
cv2.imshow('origin_RGB_image_to_HSV_histogram_to_RGB', hsv_img1)
cv2.imshow('HSV_histogram_to_gray', image_gray)
cv2.imshow('gray_HSV_histogram_to_highPassFiltering', iimg)
cv2.imshow('gray_HSV_histogram_to_highPassFiltering_to_RGB', iimage_color)

# cv2.waitKey(0)
# cv2.destroyAllWindows()

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
# 展示结果
b1, g1, r1 = cv2.split(img1)
img1 = cv2.merge([r1, g1, b1])
plt.subplot(241), plt.imshow(img1), plt.title('原图像')
plt.axis('off')

b2, g2, r2 = cv2.split(img2)
img2 = cv2.merge([r2, g2, b2])
plt.subplot(242), plt.imshow(img2), plt.title('直方图规定化原图像')
plt.axis('off')

b3, g3, r3 = cv2.split(img_hsv1)
img_hsv1 = cv2.merge([r3, g3, b3])
plt.subplot(243), plt.imshow(img_hsv1), plt.title('原图像转HSV')
plt.axis('off')

b4, g4, r4 = cv2.split(hsv_img2)
hsv_img2 = cv2.merge([r4, g4, b4])
plt.subplot(244), plt.imshow(hsv_img2), plt.title('原图像转HSV再转RGB')
plt.axis('off')

b5, g5, r5 = cv2.split(hsv_img1)
hsv_img1 = cv2.merge([r5, g5, b5])
plt.subplot(245), plt.imshow(hsv_img1), plt.title('原图像直方图规定化')
plt.axis('off')

# g6, r6 = cv2.split(image_gray)
# image_gray = cv2.merge([r6, g6])
plt.subplot(246), plt.imshow(image_gray, 'gray'), plt.title('原图像直方图规定化转灰度图像')
plt.axis('off')

# g7, r7 = cv2.split(iimg)
# iimg = cv2.merge([r7, g7])
plt.subplot(247), plt.imshow(iimg, 'gray'), plt.title('原图像直方图规定化转灰度图像做高通滤波')
plt.axis('off')

b8, g8, r8 = cv2.split(image11)
image11 = cv2.merge([r8, g8, b8])
plt.subplot(248), plt.imshow(iimage_color), plt.title('原图像直方图规定化转灰度图像高通滤波转RGB')
plt.axis('off')

plt.show()

文章作者: 小冷同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小冷同学 !
用户交流区

温馨提示: 遵纪守法, 友善评论!