图像增强-其他方法汇总
这里汇总一下几个图像增强方法:直方图规定化、同态滤波器、彩色图像增强方法,测试结果图就懒得放了…
直方图规定化
针对直方图均衡化的存在的一些问题,将原始图像的直方图转化为规定的直方图的形式。一般目标图像的直方图的确定需要参考原始图像的直方图,并利用多高斯函数得到。
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))