基于Retinex的水下图像增强算法---去除光照的影响,还原图像的本来面目

1、单尺度SSR(Single Scale Retinex)

import cv2
import numpy as np
import matplotlib.pyplot as plt

#SSR
def replaceZeroes(data):
    min_nonzero = min(data[np.nonzero(data)])
    data[data == 0] = min_nonzero
    return data

def SSR(img,ksize):
    L_blur = cv2.GaussianBlur(img,(ksize,ksize),0)  # 对输入图像进行高斯模糊处理
    img = replaceZeroes(img)
    L_blur = replaceZeroes(L_blur)
 
    dst_img = cv2.log(img/255.0)
    dst_Lblur = cv2.log(L_blur/255.0)
    dst_IxL = cv2.multiply(dst_img,dst_Lblur)    # 高斯模糊后的图与原图相乘?不这样,只会留下边缘部分
    log_R = cv2.subtract(dst_img,dst_IxL)
#     log_R = cv2.subtract(dst_img,dst_Lblur)
 
    # array = cv2.normalize(array,None,0,255,cv2.NORM_MINMAX),指定将图片的像素值放缩到 0-255 之间,线性量化
    # 量化操作,量化的方式对处理效果有决定性影响,目前没有论文能够对这一块选用什么方式讲清楚
    dst_R = cv2.normalize(log_R,None,0,255,cv2.NORM_MINMAX)   
    # array = cv2convertScaleAbs(src, dst=None, alpha=None, beta=None)
    # 输入深度图数组中的每个值srci(它是16位的,数据类型是uint16),先乘以系数α,再加上偏置β,最后将结果取绝对值,
    # 并截取为8位(uint8),然后返回与原数组相同维度的数组dst。
    dsr_R = np.exp(dst_R)
    log_uint8 = cv2.convertScaleAbs(dst_R)
    return log_uint8 
    
    # 效果一样,手动实现缩放
#     minvalue,maxvalue,minloc,maxloc = cv2.minMaxLoc(log_R)
#     for i in range(h):
#         for j in range(w):
#             log_R[i,j] = (log_R[i,j]-minvalue)*255.0/(maxvalue-minvalue)
#     log_uint8 = cv2.convertScaleAbs(log_R)
#     return log_uint8

img = cv2.imread("C:\\Users\\HP\\Desktop\\ssr_test.PNG")
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
ssr_img = SSR(img,3) 
plt.subplot(3,1,1)
plt.imshow(img)
plt.subplot(3,1,2)
plt.imshow(ssr_img)
float_img.shape,blur_img.shape

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值