数字图像处理(学习笔记)---直方图匹配(image histogram matching)(处理灰度图片和RGB图片)

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()



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值