1、处理灰度图片
将输入图片的直方图向参考图片的直方图靠近,然后输出图片
#直方图匹配
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import math
import cv2
def histogramMatching(img1,img2):#参数分别为输入图片和参考图片
img_H1,img_W1=img1.shape#输入图片维度
img_H2,img_W2=img2.shape#参考图片维度
retimg=np.zeros((img_H1,img_W1,3),dtype=np.uint8)#输出图片
total1=img_W1*img_H1#输入图片总像素数
total2=img_H2*img_W2#参考图片总像素数
sum1=np.zeros(256) #输入各图像统计
sum2=np.zeros(256)#参考各图像统计
S=np.zeros(256) #输入图像均衡化
G = np.zeros(256) #参考图像均衡化
Z=np.zeros(256) #输出目标图像
#分别对输入图片和参考图片进行图像均衡
for i in range(img_H1):
for j in range(img_W1):
sum1[img1[i][j]]+=1
for i in range(img_H2):
for j in range(img_W2):
sum2[img2[i][j]]+=1
S[0]=255*sum1[0]/total1
G[0]=255*sum2[0]/total2
for k in range(1,256):
S[k]+=S[k-1]+255*sum1[k]/total1
G[k] += G[k - 1] + 255 * sum2[k] / total2
for k in range(256):
S[k]=np.round(S[k])
G[k] = np.round(G[k])
#找到(输入图像均衡化后的图像)的各灰度值在(参考图像均衡化后的图像)中对应的灰度值
for k in range(256):
if Z[int(S[k])]==0:
if G[int(S[k])]!=0:
Z[int(S[k])]=S[k]
else:
tp = 1
while(1):
if(S[k]-tp>=0 and G[int(S[k]-tp)]!=0):
Z[int(S[k])] = S[k]-tp
break
elif(S[k]+tp<256 and G[int(S[k]+tp)]!=0):
Z[int(S[k])] = S[k]+tp
break
tp += 1
for i in range(img_H1):#生成输出图像
for j in range(img_W1):
retimg[i][j]=Z[int(S[img1[i][j]])]#img[i][j]输入图像对应灰度值,S[img[i][j]]前述灰度值均衡化后的值,Z[int(S[img1[i][j]])]前述值在目标图像中对应的灰度值
return retimg
im1=Image.open('2.jpg').convert('L')#转化为灰度图片
im2=Image.open('1.jpg').convert('L')
im_array1=np.array(im1)
im_array2=np.array(im2)
image1 = histogramMatching(im_array1,im_array2)
image1 = Image.fromarray(image1.astype('uint8')).convert('L') #convert为L--灰度图像
image1.show()
原图像:
原图像直方图:
参考图像:
参考图像直方图:
输出图像:
输出图像直方图:
2、处理RGB图片
原理与直方图均衡相同,对RGB每个通道分别处理即可
#直方图匹配
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import math
def histogramMatching(img1,img2):
img_H1,img_W1,_=img1.shape
img_H2,img_W2,_=img2.shape
retimg=np.zeros((img_H1,img_W1,3),dtype=np.uint8)
total1=img_W1*img_H1
total2=img_W2*img_H2
for l in range(3):#对RGB每个通道分别处理
sum1 = np.zeros(256) # 输入图像统计
sum2 = np.zeros(256) # 参考图像统计
S = np.zeros(256) # 输入图像均衡化
G = np.zeros(256) # 参考图像均衡化
Z = np.zeros(256) # 输出目标图像
#分别对输入图片和目标图片进行图像均衡
for i in range(img_H1):
for j in range(img_W1):
sum1[img1[i][j][l]]+=1
for i in range(img_H2):
for j in range(img_W2):
sum2[img2[i][j][l]]+=1
S[0]=255*sum1[0]/total1
G[0]=255*sum2[0]/total2
for k in range(1,256):
S[k]+=S[k-1]+255*sum1[k]/total1
G[k] += G[k - 1] + 255 * sum2[k] / total2
for k in range(256):
S[k] = np.round(S[k])
G[k] = np.round(G[k])
for k in range(256):
if Z[int(S[k])] == 0:
if G[int(S[k])] != 0:
Z[int(S[k])] = S[k]
else:
tp = 1
while (1):
if (S[k] - tp >= 0 and G[int(S[k] - tp)] != 0):
Z[int(S[k])] = S[k] - tp
break
elif (S[k] + tp < 256 and G[int(S[k] + tp)] != 0):
Z[int(S[k])] = S[k] + tp
break
tp += 1
for i in range(img_H1):
for j in range(img_W1):
retimg[i][j][l] = Z[int(S[img1[i][j][l]])]
return retimg
im1=Image.open('7.jpg')
im2=Image.open('9.jpg')
im_array1=np.array(im1)
im_array2=np.array(im2)
image1= histogramMatching(im_array1,im_array2)
image1 = Image.fromarray(image1.astype('uint8')).convert('RGB') #convert为L--灰度图像
image1.show()