92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
import numpy as np
|
||
from cv2 import xphoto
|
||
import cv2
|
||
from PIL import Image, ImageOps
|
||
from matplotlib.patches import Rectangle
|
||
import matplotlib.pyplot as plt
|
||
|
||
|
||
def learnWb(img):
|
||
wb = xphoto.createLearningBasedWB('color_balance_model.yml')
|
||
# 读取图像
|
||
# image = cv2.imread('IMG_3575.png')
|
||
# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||
# 应用白平衡
|
||
white_balanced_image = wb.balanceWhite(img)
|
||
# 显示或保存结果
|
||
cv2.imshow('White Balanced Image', white_balanced_image)
|
||
cv2.waitKey(0)
|
||
cv2.destroyAllWindows()
|
||
|
||
def ground_truth(image, img_patch, mode='mean'):
|
||
# 使用均值或最大值来进行颜色校正
|
||
if mode == 'mean':
|
||
image_gt = ((image * (img_patch.mean() / image.mean(axis=(0, 1)))).clip(0, 255).astype(int))
|
||
elif mode == 'max':
|
||
image_gt = ((image * 1.0 / img_patch.max(axis=(0, 1))).clip(0, 1))
|
||
else:
|
||
raise ValueError("Invalid mode. Use 'mean' or 'max'.")
|
||
|
||
# 绘制原始图像和Ground Truth校正后的对比图
|
||
fig, ax = plt.subplots(1, 2, figsize=(14, 10))
|
||
ax[0].imshow(image)
|
||
ax[0].set_title('原始图像')
|
||
ax[0].axis('off')
|
||
|
||
ax[1].imshow(image_gt)
|
||
ax[1].set_title('Ground Truth校正后的图像')
|
||
ax[1].axis('off')
|
||
|
||
plt.show()
|
||
|
||
|
||
def gray_world(image_path):
|
||
# 读取图像
|
||
image = cv2.imread(image_path)
|
||
|
||
# 转换图像颜色通道顺序(OpenCV使用BGR,而matplotlib使用RGB)
|
||
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||
|
||
# 计算图像的平均亮度
|
||
avg_brightness = image.mean()
|
||
|
||
# 计算每个颜色通道的平均亮度
|
||
avg_channel_brightness = image.mean(axis=(0, 1))
|
||
|
||
# 计算亮度比例,并相应地调整每个颜色通道
|
||
image_grayworld = ((image * (avg_brightness / avg_channel_brightness)).clip(0, 255).astype(int))
|
||
|
||
# 绘制原始图像和灰色世界校正后的对比图
|
||
fig, ax = plt.subplots(1, 2, figsize=(14, 10))
|
||
ax[0].imshow(image)
|
||
ax[0].set_title('原始图像')
|
||
ax[0].axis('off')
|
||
|
||
ax[1].imshow(image_grayworld)
|
||
ax[1].set_title('灰色世界校正后的图像')
|
||
ax[1].axis('off')
|
||
|
||
plt.show()
|
||
|
||
|
||
# img = Image.open('IMG_3579.png')
|
||
# img = np.array(img)
|
||
|
||
# learnWb(img)
|
||
|
||
# # 读取图像
|
||
# image = cv2.imread('IMG_3578.png')
|
||
# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||
#
|
||
# # 选择参考色块的区域
|
||
# img_patch = image[800:850, 1800:1850, :]
|
||
# # 显示图像和参考色块的矩形框
|
||
# fig, ax = plt.subplots(figsize=(10, 10))
|
||
# ax.set_title('参考块在红色矩形框内')
|
||
# ax.imshow(image)
|
||
# ax.add_patch(Rectangle((1800, 800), 50, 50, edgecolor='r', facecolor='none'))
|
||
#
|
||
# # 调用 Ground Truth Algorithm
|
||
# ground_truth(image, img_patch, mode='mean')
|
||
|
||
gray_world("IMG_3577.png") |