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")
|