图像增强-其他方法汇总

图像增强-其他方法汇总

这里汇总一下几个图像增强方法:直方图规定化、同态滤波器、彩色图像增强方法,测试结果图就懒得放了…

直方图规定化

针对直方图均衡化的存在的一些问题,将原始图像的直方图转化为规定的直方图的形式。一般目标图像的直方图的确定需要参考原始图像的直方图,并利用多高斯函数得到。

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
 
def get_map(Hist):
    # 计算概率分布Pr
    sum_Hist = sum(Hist)
    Pr = Hist/sum_Hist
    # 计算累计概率Sk
    Sk = []
    temp_sum = 0
    for n in Pr:
        temp_sum = temp_sum + n
        Sk.append(temp_sum)
    Sk = np.array(Sk)
    # 计算映射关系img_map
    img_map = []
    for m in range(256):
        temp_map = int(255*Sk[m] + 0.5)
        img_map.append(temp_map)
    img_map = np.array(img_map)
    return img_map
 
def get_off_map(map_): # 计算反向映射,寻找最小期望
    map_2 = list(map_)
    off_map = []
    temp_pre = 0 # 如果循环开始就找不到映射时,默认映射为0
    for n in range(256):
        try:
            temp1 = map_2.index(n)
            temp_pre = temp1
        except BaseException:
            temp1 = temp_pre # 找不到映射关系时,近似取向前最近的有效映射值
        off_map.append(temp1)
    off_map = np.array(off_map)
    return off_map
 
def get_infer_map(infer_img):
    infer_Hist_b = cv2.calcHist([infer_img], [0], None, [256], [0,255])
    infer_Hist_g = cv2.calcHist([infer_img], [1], None, [256], [0,255])
    infer_Hist_r = cv2.calcHist([infer_img], [2], None, [256], [0,255])
    infer_b_map = get_map(infer_Hist_b)
    infer_g_map = get_map(infer_Hist_g)
    infer_r_map = get_map(infer_Hist_r)
    infer_b_off_map = get_off_map(infer_b_map)
    infer_g_off_map = get_off_map(infer_g_map)
    infer_r_off_map = get_off_map(infer_r_map)
    return [infer_b_off_map, infer_g_off_map, infer_r_off_map]
 
def get_finalmap(org_map, infer_off_map): # 计算原始图像到最终输出图像的映射关系
    org_map = list(org_map)
    infer_off_map = list(infer_off_map)
    final_map = []
    for n in range(256):
        temp1 = org_map[n]
        temp2 = infer_off_map[temp1]
        final_map.append(temp2)
    final_map = np.array(final_map)
    return final_map
 
def get_newimg(img_org, org2infer_maps):
    w, h, _ = img_org.shape
    b, g ,r =cv2.split(img_org)
    for i in range(w):
        for j in range(h):
            temp1 = b[i,j]
            b[i,j] = org2infer_maps[0][temp1]
    for i in range(w):
        for j in range(h):
            temp1 = g[i,j]
            g[i,j] = org2infer_maps[1][temp1]
    for i in range(w):
        for j in range(h):
            temp1 = r[i,j]
            r[i,j] = org2infer_maps[2][temp1]
    newimg = cv2.merge([b,g,r])
    return newimg
 
def get_new_img(img_org, infer_map):
    org_Hist_b = cv2.calcHist([img_org], [0], None, [256], [0,255])
    org_Hist_g = cv2.calcHist([img_org], [1], None, [256], [0,255])
    org_Hist_r = cv2.calcHist([img_org], [2], None, [256], [0,255])
    org_b_map = get_map(org_Hist_b)
    org_g_map = get_map(org_Hist_g)
    org_r_map = get_map(org_Hist_r)
    org2infer_map_b = get_finalmap(org_b_map, infer_map[0])
    org2infer_map_g = get_finalmap(org_g_map, infer_map[1])
    org2infer_map_r = get_finalmap(org_r_map, infer_map[2])
    return get_newimg(img_org, [org2infer_map_b, org2infer_map_g, org2infer_map_r])

样例测试:

infer_img = cv2.imread(r'C:\Users\admin\Desktop\Data\ComputerVision\exp1\testPic\red.jpg')
img_org = cv2.imread(r'C:\Users\admin\Desktop\Data\ComputerVision\exp1\testPic\trees.jpg')
infer_map = get_infer_map(infer_img)   # 计算参考映射关系
new_img = get_new_img(img_org, infer_map) # 根据映射关系获得新的图像
b,g,r = cv2.split(img_org)  
img_org = cv2.merge([r,g,b]) 
plt.imshow(img_org)
plt.axis('off')
plt.show()
b,g,r = cv2.split(new_img)  
new_img = cv2.merge([b,g,r]) 
plt.imshow(new_img)
plt.axis('off')
plt.show()
(b, g, r) = cv2.split(new_img)
# bH = cv2.equalizeHist(b)
# gH = cv2.equalizeHist(g)
# rH = cv2.equalizeHist(r)
new_img = cv2.merge((bH, gH, rH))
cv2.imwrite(r'C:\Users\admin\Desktop\Data\ComputerVision\exp1\testPic\red_trees.jpg',new_img)

同态滤波器

图像的灰度图像f(x,y)可以看做为入射光分量和反射光分量两部分组成:f(x,y)=i(x,y)r(x,y).入射光比较的均匀,随着空间位置变化比较小,占据低频分量段。反射光由于物体性质和结构特点不同从而反射强弱很不相同的光,随着空间位置的变化比较的剧烈。占据着高频分量。基于图像是由光照谱和反射谱结合而成的原理设计的。

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline

#####################################################################
#############        自定义同态滤波器函数      ################r1-亮度
#####################################################################
def homomorphic_filter(src, d0=1, r1=2, rh=2, c=4, h=2.0, l=0.5):

    #图像灰度化处理
    gray = src.copy()
    if len(src.shape) > 2:#维度>2
        gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

    #图像格式处理
    gray = np.float64(gray) 
    #设置数据维度n
    rows, cols = gray.shape
    #傅里叶变换
    gray_fft = np.fft.fft2(gray) 
    #将零频点移到频谱的中间,就是中间化处理
    gray_fftshift = np.fft.fftshift(gray_fft)
    #生成一个和gray_fftshift一样的全零数据结构
    dst_fftshift = np.zeros_like(gray_fftshift)
    #arange函数用于创建等差数组,分解f(x,y)=i(x,y)r(x,y)
    M, N = np.meshgrid(np.arange(-cols // 2, cols // 2), np.arange(-rows//2, rows//2))#注意,//就是除法
    #使用频率增强函数处理原函数(也就是处理原图像dst_fftshift)
    D = np.sqrt(M ** 2 + N ** 2)#**2是平方
    Z = (rh - r1) * (1 - np.exp(-c * (D ** 2 / d0 ** 2))) + r1
    dst_fftshift = Z * gray_fftshift
    dst_fftshift = (h - l) * dst_fftshift + l

    #傅里叶反变换(之前是正变换,现在该反变换变回去了)
    dst_ifftshift = np.fft.ifftshift(dst_fftshift)
    dst_ifft = np.fft.ifft2(dst_ifftshift)
    #选取元素的实部
    dst = np.real(dst_ifft)
    #dst中,比0小的都会变成0,比0大的都变成255
    #uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0–255
    dst = np.uint8(np.clip(dst, 0, 255))
    return dst

img = cv2.imread(r'C:\Users\admin\Desktop\Data\ComputerVision\exp1\testPic\mytable.jpg',0)
plt.imshow(img, cmap='gray')
plt.show()
plt.imshow(homomorphic_filter(img), cmap='gray')
plt.show()

彩色图像增强方法

针对于灰度图像,我们主要有以上的几种处理方法,但是针对于彩色图像,由于存在RGB分量,故而不能直接将灰度图像的处理方法应用。因为直接对每一个分量使用灰度增强的方法会导致颜色的紊乱发生。

而我们可以将RGB图像转化为其他空间的图像,比如:我们可以将RGB空间的图像转换为HSV空间的图像。HSV分别指色调,饱和度,亮度。由于调整HSV三个不同的量,我们可以得到比较直观的。

RGB通道均衡化
import cv2
img = imread(r'C:\Users\admin\Desktop\Data\ComputerVision\exp1\testPic\mytable.jpg')
# 直方图均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
new_img = cv2.merge((bH, gH, rH))
plt.imshow(img)
plt.show()
plt.imshow(new_img)
HSV均衡化
def equalize_hist_color_hsv(img):
    H, S, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
    eq_V = cv2.equalizeHist(V)
    eq_image = cv2.cvtColor(cv2.merge([H, S, eq_V]), cv2.COLOR_HSV2BGR)
    return eq_image
img = imread(r'C:\Users\admin\Desktop\Data\ComputerVision\exp1\testPic\mytable.jpg')
plt.imshow(img)
plt.show()
plt.imshow(equalize_hist_color_hsv(img))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的风666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值