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()
上一篇

1716. 计算力扣银行的钱
2022-01-15
下一篇

迁移学习
2021-09-28
温馨提示: 遵纪守法, 友善评论!