1. 程式人生 > >彩色和灰度圖片直方圖均衡化

彩色和灰度圖片直方圖均衡化

直方圖均衡化是對於一幅影象,其具有多個灰度等級的畫素,我們儘可能讓這些灰度等級出現頻率的概率密度函式趨近於常數。這麼做的意義在哪裡?當一幅影象比較暗的時候,灰度等級絕大部分處於低等級的狀態,那麼由於我們使灰度等級頻率的概率密度函式儘可能趨向於常數,即儘可能保證在各個灰度等級出現頻率一樣,我們認為此時應該有更高的對比度,展示的細節更加細膩。在影象處於過亮的情況下也可以得出相近結論。

舉個例子,來自於《數字影象處理》第三章
有大小為64 * 64 畫素的3位元數字影象的灰度分佈和直方圖值如下:
imagexx

下面我們計算原本的灰度等級各自對映到哪個等級。
\(s_0 = 7\Sigma_{j=0}^0p_r(r_0) = 7 * p_r(r_0) = 1.33\)


\(s_1 = 7\Sigma_{j=0}^1p_r(r_0) = 7 * p_r(r_0) + 7 * p_r(r_1) = 3.08\)
\(s_0\)四捨五入得1(實際計算機中灰度等級只能是離散的)
\(s_1\)四捨五入得3。
其他每個灰度等級的對映都類似,可以分別計算出均衡化後每個原灰度等級應該對映到的新的灰度等級。
image1
Lena的灰度圖

image2
Lena灰度圖做直方圖均衡化後

image3
Lena的彩色圖

image4
Lena彩色圖做直方圖均衡化後

對於彩色影象的直方圖均衡化,可以考慮使用R,G,B三個通道分別均衡化,然後將三個通道合在一起。但這樣有可能會改變色調。
下面是直方圖均衡化的python實現,依賴PIL包

def his_equ(img, outfile,level=256,mode='RGB'):
    '''

    :param img: Image.open開啟的檔案控制代碼
    :param outfile: 輸出檔案的檔名
    :param level:灰度等級,彩色圖是每個通道對應的等級數
    :param mode:'rgb'為彩色模式,'gray'為灰度圖
    :return: 按照輸出檔案路徑儲存均衡化之後的圖片
    '''
    if mode == 'RGB' or mode == 'rgb':
        r, g, b = [], [], []
        width, height = img.size[0], img.size[1]
        sum_pix = width * height
        pix = img.load()
        for x in range(width):
            for y in range(height):
                r.append(pix[x, y][0])
                g.append(pix[x, y][1])
                b.append(pix[x, y][2])
        r_c = dict(Counter(r))
        g_c = dict(Counter(g))
        b_c = dict(Counter(b))
        r_p,g_p,b_p = [],[],[]

        for i in range(level):
            if r_c.has_key(i):
                r_p.append(float(r_c[i]) / sum_pix)
            else:
                r_p.append(0)
            if g_c.has_key(i):
                g_p.append(float(g_c[i])/sum_pix)
            else:
                g_p.append(0)
            if b_c.has_key(i):
                b_p.append(float(b_c[i])/sum_pix)
            else:
                b_p.append(0)
        temp_r,temp_g,temp_b = 0,0,0
        for i in range(level):
            temp_r += r_p[i]
            r_p[i] = int(temp_r * (level-1))
            temp_b += b_p[i]
            b_p[i] = int(temp_b *(level-1))
            temp_g += g_p[i]
            g_p[i] = int(temp_g*(level -1))
        new_photo = Image.new('RGB',(width,height))
        for x in range(width):
            for y in range(height):
                new_photo.putpixel((x,y),(r_p[pix[x,y][0]],g_p[pix[x,y][1]],b_p[pix[x,y][2]]))
        new_photo.save(outfile)
    elif mode == 'gray' or mode == 'GRAY':
        width, height = img.size[0], img.size[1]
        sum_pix = width * height
        pix = img.load()
        pb = []
        for x in range(width):
            for y in range(height):
                pb.append(pix[x,y])
        pc = dict(Counter(pb))
        pb = []
        for i in range(level):
            if pc.has_key(i):
                pb.append(float(pc[i]) / sum_pix)
            else:
                pb.append(0)
        temp = 0
        for i in range(level):
            temp += pb[i]
            pb[i] = int(temp * (level-1))
        new_photo = Image.new('L',(width,height))
        for x in range(width):
            for y in range(height):
                new_photo.putpixel((x,y),pb[pix[x,y]])
        new_photo.save(outfile)
if __name__ == '__main__':
    ppp = Image.open('Lena.jpg','r')
    his_equ(ppp,'lena_his.jpg')

相關推薦

彩色圖片直方圖均衡化

直方圖均衡化是對於一幅影象,其具有多個灰度等級的畫素,我們儘可能讓這些灰度等級出現頻率的概率密度函式趨近於常數。這麼做的意義在哪裡?當一幅影象比較暗的時候,灰度等級絕大部分處於低等級的狀態,那麼由於我們使灰度等級頻率的概率密度函式儘可能趨向於常數,即儘可能保證在各個灰度等級出現頻率一樣,我們認為此時應該有更高

matlab直方圖均衡化代…

matlab灰度圖直方圖均衡化程式碼 clear all %一,影象的預處理,讀入彩色影象將其灰度化 PS=imread('1.jpg');                        %讀入JPG彩色影象檔案 imshow(PS)                                 %顯示出

[原始碼和文件分享]基於QtOpenCV實現彩色圖的轉換

一、實驗目的與要求 1.1 目的 熟悉Qt視覺化開發,理解C++的面向物件思想 熟悉Qt和Opencv開發環境搭建 瞭解Qt訊息機制 初步理解Opencv的用法 學會使用c++異常處理 1.2 要求 使用Qt編寫一程式,點

Java實現圖片去噪的類

用於實現對圖片去噪和灰度化。 package org.eye; import java.awt.Color; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; import jav

Matlab 彩色圖片直方圖均衡化處理 line()函式實現

好了,不說這麼多了,直奔主題,本次分別做了兩次實現,分別是:彩色圖片轉灰度圖直方圖均衡化處理以及彩色圖片的直方圖均衡化處理,大家可以按需觀看。 一、程式原始碼 (1)彩色圖片轉灰度圖直方圖均衡化處理: %讀取圖片 I=imread('test.jpg');

opencv讀取彩色/圖片畫素值並存儲在本地檔案中c++程式碼例項及執行結果

c++程式碼彩色圖片#include<opencv2/opencv.hpp> #include<fstream> using namespace std; using namespace cv; int main(int argc, char* ar

Opencv convertScaleAbs函式 圖上進行透明彩色繪製

在將RealSense提取的深度圖片進行顯示時,由於是16點陣圖片,想將圖片轉化成為8點陣圖形進行顯示 Opencv中有一個函式convertScaleAbs可以實現這種功能 C++: void convertScaleAbs(InputArray src,

(非直接利用函式)python繪製影象直方圖及其均衡化

由於學習的需要,利用python和opencv實現簡單的灰度圖直方圖繪製及其均衡化 。程式碼如下import cv2 as cv import numpy as np from matplotlib import pyplot as plt #畫直方圖 def zhifan

虹膜極座標直方圖

灰度極座標的直方圖,可以比較方便的看到灰度的分佈圖,直觀的看出瞳孔、虹膜邊緣特點 虹膜的256灰度圖如下: 經過極座標的直方圖轉換後,如果如下: 100個點,64灰度直方圖 200點,32灰度直方圖 400點,32灰度直方圖 通過對比,可以看出,用

數字影象處理 | 空間解析度

空間解析度 直觀上看 , 空間解析度是影象中可辨別的最小細節的度量。在數量上 , 空間解析度可以有很多方法來說明 , 其中每單位距離線對數和每單位距離點數(畫素數)是最通用的度量。在美國,這一度量通常使用每英寸點數(dpi)來表示。空間解析度的度量必須針對空間單位來規定才有意義。 灰度解析度

Nginx配置之負載均衡、限流、快取、黑名單釋出

一、Nginx安裝(基於CentOS 6.5) 1.yum命令安裝 yum install nginx –y (若不能安裝,執行命令yum install epel-release) 2. 啟動、停止和重啟 service nginx start service nginx stop

C#:電腦螢幕截圖 , RGB圖轉圖片

using System; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; namespace test { public partial class Form1 : Form

顏色的亮度計算

對於彩色轉灰度,有一個很著名的心理學公式:Gray = R*0.299 + G*0.587 + B*0.114 ,不是LAB顏色中的L 簡單的亮度計算:(亮度) = 0.299*R + 0.587*G + 0.114*B或者 亮度=(R* 19595 + G* 38469

使用matlab對影象進行二值化化處理

用matlab對影象進行二值化處理 >>m = imread('d:\image\logo.jpg'); >> imshow(n); >> n = graythre

彩色演算法(FPGA實現)

一、演算法基礎   對於彩色轉灰度,有一個很著名的心理學公式:Gray = R*0.299 + G*0.587 + B*0.114。 二、整數演算法   而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。   注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法:

Java實現24位真彩轉換為8位圖片

         Windows下的點陣圖檔案即我們通常所熟悉的BMP圖片,其儲存結構的格式可以在WINGDI.h檔案中找到定義。BMP檔案大體上分為四個部分: 1.      點陣圖檔案頭(BITMAPFILEHEADER) 2.      點陣圖資訊頭(BITMAPIN

BMP影象的結構及讀寫

1.文件目的 本文件主要給出24位真彩BMP影象的結構、讀寫和灰度化方法。 2.一般BMP影象的結構 一般的bmp檔案的結結構主要包括檔案頭,BMP資訊頭,調色盤,點陣圖資料內容 (1)BMP檔案頭(14位元組) ,檔案的第0位元組到第13位元組為BMP影象的檔案

Nginx配之負載均衡、快取、黑名單釋出

一、Nginx安裝(基於CentOS 6.5) 1.yum命令安裝 yum install nginx –y (若不能安裝,執行命令yum install epel-release) 2. 啟動、停止和重啟 service nginx start service nginx

單通道圖片fine-tune訓練網路與caffe批量分類測試

1. 轉imdb灰度圖資料 一定要加上--gray,否則訓練時報如下錯誤: GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_w

OpenCVForUnity二值化

隨著csdn部落格系統升級,嘗試使用md寫文章,感覺還不錯。繼續使用OpenCVForUnity處理圖片,今次的效果是灰度化和二值化,當所有功能實現後,可能會做出一個unity版的美圖秀秀。 首先我們來確定一下兩者的概念。 二值化,就是將影象上的畫素點的灰