gamma_estimation.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import cv2
  2. import numpy as np
  3. import os
  4. import os
  5. import sys
  6. sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
  7. from src.utils import binarize
  8. import matplotlib.pyplot as plt
  9. from scipy.optimize import curve_fit
  10. # 定义输入图像和屏幕返回图像的文件夹路径
  11. input_folder = 'imgs/grayscale_images_1'
  12. returned_folder = 'imgs/returned_grayscales_1'
  13. # 定义存储图像的文件名格式
  14. # input_format = 'pat{}.bmp'
  15. # output_format = '0_frame_{}.bmp'
  16. # 存储输入灰度值和返回图像亮度的数组
  17. input_gray_values = []
  18. returned_brightness_values = []
  19. mask = binarize(cv2.imread(os.path.join(input_folder, 'white.bmp'), cv2.IMREAD_GRAYSCALE))
  20. # plt.imshow(mask, cmap='gray')
  21. # 读取图像并计算灰度值和亮度值
  22. error = 0
  23. for i in range(256):
  24. # 生成文件名
  25. input_filename = os.path.join(input_folder, f'pat{i:03}.bmp')
  26. returned_filename = os.path.join(returned_folder, f'0_frame_{i}.bmp')
  27. # 读取输入灰度图和返回图像
  28. input_img = cv2.imread(input_filename, cv2.IMREAD_GRAYSCALE)
  29. returned_img = cv2.imread(returned_filename, cv2.IMREAD_GRAYSCALE)
  30. # 计算输入灰度值和返回图像的平均亮度值
  31. input_gray_value = np.mean(input_img)/255.0
  32. returned_brightness_value = np.mean(np.ma.masked_array(returned_img, mask=~mask))/255.0
  33. # 存储结果
  34. input_gray_values.append(input_gray_value)
  35. returned_brightness_values.append(returned_brightness_value)
  36. print(returned_brightness_value, input_gray_value)
  37. error += np.sum(np.abs(returned_brightness_value - input_gray_value))
  38. print(error*255.0/256.0)
  39. # 将结果转换为NumPy数组
  40. input_gray_values = np.array(input_gray_values)
  41. returned_brightness_values = np.array(returned_brightness_values)
  42. # 定义拟合的Gamma函数
  43. def gamma_function(x, gamma):
  44. return x ** gamma
  45. # 使用scipy的curve_fit函数拟合Gamma值
  46. popt, _ = curve_fit(gamma_function, input_gray_values, returned_brightness_values)
  47. gamma_est = popt[0]
  48. # 打印估计的Gamma值
  49. print(f"Estimated Gamma: {gamma_est}")
  50. # 绘制拟合曲线和数据点
  51. plt.figure()
  52. plt.scatter(input_gray_values, returned_brightness_values, label='Measured Data')
  53. plt.plot(input_gray_values, gamma_function(input_gray_values, gamma_est), color='red', label=f'Fitted Gamma = {gamma_est:.2f}')
  54. plt.xlabel('Input Gray Value')
  55. plt.ylabel('Returned Brightness Value')
  56. plt.title('Gamma Correction Fitting')
  57. plt.legend()
  58. plt.show()