图像中的简单照明校正 OpenCV C

新手上路,请多包涵

我有一些彩色照片,照片中的照明不规则:图像的一侧比另一侧更亮。

我想通过校正照明来解决这个问题。我认为局部对比会帮助我,但我不知道如何:(

你能帮我一段代码或管道吗?

原文由 user3762718 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 884
2 个回答

将 RGB 图像转换为 Lab 颜色空间(例如,任何具有亮度通道的颜色空间都可以正常工作),然后将 自适应直方图均衡 应用于 L 通道。最后将生成的 Lab 转换回 RGB。

您想要的是 OpenCV 的 CLAHE(对比度受限自适应直方图均衡)算法。但是,据我所知,它没有记录在案。 python 中有一个例子。您可以在 Graphics Gems IV 中阅读 CLAHE,第 474-485 页

以下是 CLAHE 的示例:在此处输入图像描述

这是基于 http://answers.opencv.org/question/12024/use-of-clahe/ 生成上述图像的 C++,但扩展了颜色。

 #include <opencv2/core.hpp>
#include <vector>       // std::vector
int main(int argc, char** argv)
{
    // READ RGB color image and convert it to Lab
    cv::Mat bgr_image = cv::imread("image.png");
    cv::Mat lab_image;
    cv::cvtColor(bgr_image, lab_image, CV_BGR2Lab);

    // Extract the L channel
    std::vector<cv::Mat> lab_planes(3);
    cv::split(lab_image, lab_planes);  // now we have the L image in lab_planes[0]

    // apply the CLAHE algorithm to the L channel
    cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
    clahe->setClipLimit(4);
    cv::Mat dst;
    clahe->apply(lab_planes[0], dst);

    // Merge the the color planes back into an Lab image
    dst.copyTo(lab_planes[0]);
    cv::merge(lab_planes, lab_image);

   // convert back to RGB
   cv::Mat image_clahe;
   cv::cvtColor(lab_image, image_clahe, CV_Lab2BGR);

   // display the results  (you might also want to see lab_planes[0] before and after).
   cv::imshow("image original", bgr_image);
   cv::imshow("image CLAHE", image_clahe);
   cv::waitKey();
}

原文由 Bull 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用感知亮度通道进行图像照明校正

HSV的值通道是B、G、R值中的最大值。因此感知亮度可以通过以下公式获得。

在此处输入图像描述

我已将 CLAHE 应用于此频道,看起来不错。

  1. 我计算图像的感知亮度通道

  2. a - > 我将图像更改为 HSV 颜色空间,并通过添加 CLAHE 应用的感知亮度通道来替换图像中的 V 通道。

  3. b -> 我将图像更改为 LAB 颜色空间。我通过添加 CLAHE 应用的感知亮度通道来替换图像中的 L 通道。

  4. 然后我再次将图像转换为 BGR 格式。

我的步骤的python代码

import cv2
import numpy as np

original = cv2.imread("/content/rqq0M.jpg")

def get_perceive_brightness(img):
    float_img = np.float64(img)  # unit8 will make overflow
    b, g, r = cv2.split(float_img)
    float_brightness = np.sqrt(
        (0.241 * (r ** 2)) + (0.691 * (g ** 2)) + (0.068 * (b ** 2)))
    brightness_channel = np.uint8(np.absolute(float_brightness))
    return brightness_channel

perceived_brightness_channel = get_perceive_brightness(original)

clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
clahe_applied_perceived_channel = clahe.apply(perceived_brightness_channel)

def hsv_equalizer(img, new_channel):
  hsv = cv2.cvtColor(original, cv2.COLOR_BGR2HSV)
  h,s,v =  cv2.split(hsv)
  merged_hsv = cv2.merge((h, s, new_channel))
  bgr_img = cv2.cvtColor(merged_hsv, cv2.COLOR_HSV2BGR)
  return bgr_img

def lab_equalizer(img, new_channel):
 lab = cv2.cvtColor(original, cv2.COLOR_BGR2LAB)
  l,a,b =  cv2.split(lab)
  merged_lab = cv2.merge((new_channel,a,b))
  bgr_img = cv2.cvtColor(merged_hsv, cv2.COLOR_LAB2BGR)
  return bgr_img

hsv_equalized_img = hsv_equalizer(original,clahe_applied_perceived_channel)
lab_equalized_img = lab_equalizer(original,clahe_applied_perceived_channel)

hsv_equalized_img 的输出

在此处输入图像描述 lab_equlized_img 的输出

在此处输入图像描述

原文由 Sivaram Rasathurai 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题