【PYTHON+OPENCV】彩色图像的直方图滤波

这个不是课程作业我就提前放出来了

原理:直方图均衡化的数学原理

原理:直方图均衡化的数学原理

看懂了原理以后代码还挺简单的

1.标记灰度级

hist=np.zeros((2,255))   #建立一个2x255的矩阵

    for i in range(255):   #第一列为灰度级标记
        hist[0,i]=i

    for i in range(h):
        for j in range(w):
            hist[1,img[i,j]]+=1   #记录每个灰度级出现的次数

2.计算出每个灰度级的累计频率

hs=hist.copy()
    for i in range(255):
        hs[1,i]/=sq      #计算每个灰度级的频率

    for i in range(255):    #计算每个灰度级的累计频率
        if i!=0:
            hs[1,i]+=hs[1,i-1]

3.求出新图像的灰度级

 for i in range(h):
        for j in range(w):
            HistImg[i,j]=hs[1,img[i,j]]*255  #求出新图像的灰度级

4.彩色图像和灰度图像最大的区别就是彩色图像保存的时候是三维的,第三维是3个色彩通道:BGR,所以在处理的时候需要将彩色图像分成三张灰度图像,然后对这三张图像逐一均衡化:

for i in range(3):
    HistImg[:,:,i]=imHist(Img[:,:,i])  # 此为直方图均衡化

完整代码如下:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


# 直方图均衡化

def RGB2GRAY(Img):
    for i in range(3):
        cv.imwrite('jhh'+str(i)+'.jpg',Img[:,:,i])


def cenGray(img):  # 统计每个灰度级的个数
    h = img.shape[0]
    w = img.shape[1]

    hist = np.zeros((2, 256))  # 建立一个2x255的矩阵

    for i in range(256):  # 第一列为灰度级标记
        hist[0, i] = i

    for i in range(h):
        for j in range(w):
            hist[1, img[i, j]] += 1  # 记录每个灰度级出现的次数

    return hist


def calcFrequency(image):  # 根据灰度值累计频率计算每个灰度级映射成什么灰度值
    hist = cenGray(image)
    h = image.shape[0]
    w = image.shape[1]
    sq = h * w
    for i in range(256):
        hist[1, i]= hist[1,i]/sq  # 计算每个灰度级的频率

    for i in range(256):  # 计算每个灰度级的累计频率
        if i != 0:
            hist[1, i] += hist[1, i - 1]

    return hist


def imHist(image):
    HistImg = image.copy()
    hist = calcFrequency(image)
    h=image.shape[0]
    w=image.shape[1]
    for i in range(h):
        for j in range(w):
            HistImg[i, j] =int( hist[1, image[i, j]] * 255)  # 求出新图像的灰度级

    return HistImg


Img = cv.imread('test2.jpg')


HistImg=Img.copy()
for i in range(3):
    HistImg[:,:,i]=imHist(Img[:,:,i])  # 此为直方图均衡化

cv.imshow('HistImg',HistImg)

cv.waitKey(0)
cv.destroyAllWindows()


最终结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值