图片光照不均修正处理

基本算法思想:

我们是基于 Retinex 详见:

代码实现:

代码原址:https://github.com/sexjun/-1602–

文件结构

图片光照不均修正处理_第1张图片
下载之后直接进入cds_arithmetic文件夹下执行文件cds_retinex.py即可

选用代码

import numpy as np
import cv2 as cv
import sys

def localStd(img):
    # 归一化
    # img = img / 255.0
    # 计算均值图像和均值图像的平方图像
    img_blur = cv.blur(img, (21, 21))
    reslut_1 = img_blur ** 2
    # 计算图像的平方和平方后的均值
    img_2 = img ** 2
    reslut_2 = cv.blur(img_2, (21, 21))

    reslut = np.sqrt(np.maximum(reslut_2 - reslut_1, 0))
    return reslut


def get_reflect(img, img_illumination):
    # get_img_illumination = get_illumination(img)
    get_img_reflect = (img + 0.001) / (img_illumination + 0.001)
    return get_img_reflect


def enhancement_reflect(img):
    # 通过高斯滤波器
    gaussian_blur_img = cv.GaussianBlur(img, (21, 21), 0)
    enhancement_reflect_img = img * gaussian_blur_img
    return enhancement_reflect_img


def get_enhancment_img(img_enhance_illumination, img_enahnce_reflect):
    img = img_enhance_illumination * img_enahnce_reflect
    img = img.astype('uint8')
    return img


def read_img_from_disk(file_path):
    # 0. 读取图像
    img = cv.imread(file_path, cv.IMREAD_COLOR)
    return img


def get_illumination(img):
    return cv.GaussianBlur(img, (15, 15), 0)


"""
enhancment_illumination 增强反射分量,传入反射分量,返回增强后的反射分量
"""


def enhancment_illumination(img_illumination):
    img_hsv = cv.cvtColor(img_illumination, cv.COLOR_BGR2HSV)
    img_hsv = (img_hsv - np.min(img_hsv)) / (np.max(img_hsv) - np.min(img_hsv))
    h, s, v = cv.split(img_hsv)
    wsd = 5
    gm = np.mean(v) / (1 + wsd * np.std(v)) # 一个数字
    cst = localStd(v)   # 300 * 400 的矩阵
    lm = gm * v /(1 + wsd * cst)    # 300 * 400 的矩阵
    c = np.exp(gm)      # 一个常数
    wg = v ** 0.2       # 300 *400
    wl = 1- wg
    outM = v**c / (v**c +(wl * lm)**c + (wg * gm)**c + 0.001)
    outM = 1.5 * outM - 0.5 * cv.GaussianBlur(outM, (21, 21), 0)
    outM = (outM - np.min(outM))/(np.max(outM) - np.min(outM))
    paramerter = 0.9
    img_illumination[:, :, 0] = outM * (img_illumination[:, :, 0] / (v + 0.01))**paramerter
    img_illumination[:, :, 1] = outM * (img_illumination[:, :, 1] / (v + 0.01))**paramerter
    img_illumination[:, :, 2] = outM * (img_illumination[:, :, 2] / (v + 0.01))**paramerter
    return img_illumination


if __name__ == '__main__':
    file_name = "./data/src/3.jpg"
    img = read_img_from_disk(file_name)  # 读取图像

    # img = cv.resize(img, (0, 0), fx=0.2, fy=0.2, interpolation=cv.INTER_NEAREST)

    img_illumination = get_illumination(img)    # 获得高频分量
    img_reflect = get_reflect(img, img_illumination)    # 获得反射分量
    img_enhancement_reflect = enhancement_reflect(img_reflect)  # 增强反射分量
    img_enhancement_illumination = enhancment_illumination(img_illumination)    # 增强照射分量
    img_done = get_enhancment_img(img_enhancement_illumination, img_reflect)    # 照射分量与反射分量融合
    cv.imshow("src", img)
    cv.imshow("img_reflect", img_reflect)
    cv.imshow("img_illumination", img_illumination)
    cv.imshow("done", img_done)
    cv.waitKey(0)
    # # 原图
    # cv.imwrite("./data/done/matlab/src_img.png", img)
    # # 照射分量
    # cv.imwrite("./data/done/matlab/img_illumination.png", img_illumination)
    # # 反射分量
    # cv.imwrite("./data/done/matlab/img_reflect.png", img_reflect)
    # # 照射增强
    # cv.imwrite("./data/done/matlab/illumination_done.png", img_enhancement_illumination)
    # # 反射增强
    # cv.imwrite("./data/done/matlab/img_enhancement_reflect.png", img_enhancement_reflect)
    # # 结果
    cv.imwrite("./data/done/matlab/img_done.png", img_done)
    print("done")
    cv.destroyAllWindows()
    print("done for everthong")

上述的函数具体内容已经标注,在主函数中file_name 设置处理图片地址,cv.imwrite是将在函数中处理好的图片保存起来也就是写入你要写入的文件夹下保存处理,所有图片都可以保存这里我只选择保存原图片,和处理好后的图片以及获得高频分量的图片保存

调制过程

环境安装

1.numpy 所有版本基本都可 (我安的是:1.19.5)
2.cv2(全称:opencv-python) (我安的是:4.5.1.48)

实验结果

图片光照不均修正处理_第2张图片

调制报错:

你直接用github文件中的图片进行处理,完全可以运行,但是一旦我改了相对路径处理自己的图片就产生下列报错:

Traceback (most recent call last):
  File "E:/python/test/test.py", line 8, in <module>
    fa = face_detector.detectMultiScale(gray, 1.1, 3)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-6uw63ony\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

里面impath路径的xml文件路径不对,应该将路径改为全局路径

file_name = "G:/soft/preprocesssing/noaveragetohance/data/52.jpg"

作用简述

在自然环境下拍摄的图像,很容易出现光照不均匀的现象,而这种现象会严重影响物体的识别效果,所以,有必要对光照不均匀的图片进行优化,提高图片质量。常用的修正不均匀光照的方法有直方图均衡法(HE)和多尺度视网膜大脑皮层理论算法(MSR),而平台采用先使用MSR再使用HE的方法,这样可以结合两个算法的优势,更好的对图片进行处理。

你可能感兴趣的:(software_cup,python,opencv,图像识别)