A. MATLAB....
close all
clear all
im=imread('D:\image1.jpg');%讀圖im;
%獲取im的行、列數:row,col;
[row,col]=size(im);
%計算直方圖
for i=0:255
%計算im上i出現的次數ni;
ni=length(find(im==i));
p(i+1)=ni/(row*col);
end
%進行變換處理
for s1=1:row
for s2=1:col
%讀取原圖像對應位置的灰度值i;
i=im(s1,s2);
%imnew(s1,s2)=c(i+1);進行變換
s=0;
for j=1:i;
s=s+p(j);
end
imnew(s1,s2)=s;
end
end
im1=uint8(imnew*255);
%計算imnew的直方圖
[row1,col1]=size(im1);
for i=0:255
%計算im1上i出現的次數mi;
mi=length(find(im1==i));
p1(i+1)=mi/(row1*col1);
end
%繪圖顯示im、imnew圖像
figure(1),
imshow(im);
title('原圖像');
figure(2),
imshow(im1);
title('均衡化後的圖像');
%繪圖顯示im、imnew的直方圖
figure(3),
bar(0:255,p);
title('原圖像直方圖');
xlabel('灰度值');
ylabel('灰度值對應概率');
figure(4),
bar(0:255,p1);
title('均衡化後的直方圖');
xlabel('灰度值');
ylabel('灰度值對應概率');
B. 直方圖均衡化對有些圖片不能達到好的效果, 為什麼
我來說一下
首先直方圖均衡化的公式為sk對nj/n在j由0到k求和,正如樓主你所說,它所起到的作用是把原本分布不均的灰度直方圖在整個灰度級別內均勻分布。
呵呵,一定要抓住這一點,即均衡化是由公式實現的,你想一想,對於一幅很暗的圖片,既是它的灰度直方圖全都集中在低灰度區,即比如灰度值由0-255,灰度值是2,3,5等的低灰度的頻數就會很大,即它們的頻率好高,因為這幅畫很暗。好,現在咱們把這幅畫均衡化,看那個公式的定義,根據公式得來的數據,即均衡化後的直方圖中,低灰度區,比如5這一灰度級所對應的頻數是不是很大,因為現在的是把原圖中低灰度區,即正如上面所假設的2,3,5這些頻率很大的灰度級相加而得,當然加後所得更大,即在均衡化後,僅5這一點得頻數就已經很高,即頻數很大,即灰度級很大,可想而知,越往後加,灰度級都很大,對應的,灰度級大了,當然直方圖就集中在高灰度區,相應的圖像就發白或很亮。特別亮的也是一個道理。
對於這種情況,應該用直方圖規定化(匹配)來處理。
對於馬賽克,很簡單,你想想,先畫一個8*8格,拿不同深度的鉛筆,比如H,2H,B,2B之類的,你想在只拿一種深度的把四個格都塗滿,是不是黑乎乎一片,然後拿兩種筆塗,是不是有了區別。你用的鉛筆深度種類越多,整個格所構成的圖畫細節越明顯。同理,當你把很暗的圖均衡化後,灰度級別都集中在高灰度區,就相當於筆的種類很少來畫這幅畫,當然也有馬賽克。
給你截的圖是均衡化後的,你仔細想想.
呵呵
C. matlab里直方圖均衡化用什麼函數
matlab直方圖均衡化的函數只有一個histeq,它是用於圖像處理的。histeq的作用是把「圖像」的直方圖均衡化。
直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。
這種方法通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分布。
這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
(3)圖像均衡化演算法擴展閱讀:
這種方法可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。
這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景雜訊的對比度並且降低有用信號的對比度。
D. 求解下面一段MATLAB代碼,關於直方圖均衡化的圖像增強演算法。
%讀圖像
img=imread('D:\我的文檔\桌面\10096009_0762641.JPG');
subplot(121),imshow(img);
%將RGB分量轉換成HSI,具體見:http://..com/question/320254032.html
img_hsi=rgb2hsi(img);
%--------------------------------------------------------------------------
%ln和DFT處理過程
% img_s=fftshift(fft2(log(img_hsi(:,:,2))));
img_s=log(img_hsi(:,:,2));
img_s=img_hsi(:,:,2);
%H 巴特沃斯高通濾波器處理過程
f=double(img_s);
g=fft2(f);
g=fftshift(g);
[M,N]=size(g);
nn=5; % 2-grade Butterworth highpass filter
d0=15; % 15,30,80其中以15為例
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
h=1/(1+0.414*(d/d0)^(2*nn)); % filter transform function
%h=1./(1+(d./d0).^(2*n))
%h=exp(-(d.^2)./(2*(d0^2)));
result(i,j)=(1-h)*g(i,j);
end
end
result=ifftshift(result);
J1=ifft2(result);
img_s2=uint8(real(J1));
%--------------------------------------------------------------------------
% img_i=fftshift(fft2(log(img_hsi(:,:,3))));
img_i=log(img_hsi(:,:,3));
img_i=img_hsi(:,:,3);
%高斯濾波器
%將S分量的二維不連續Frourier變換的零頻率成分移到頻譜的中心
s=fftshift(fft2(img_i));
[M,N]=size(s); %分別返回s的行數到M中,列數到N中
n=2; %對n賦初值
%GLPF濾波,d0=5,15,30(程序中以d0=30為例)
d0=30; %初始化d0
n1=floor(M/2);n2=floor(N/2);
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2); %點(i,j)到傅立葉變換中心的距離
h=1*exp(-1/2*(d^2/d0^2)); %GLPF濾波函數
s(i,j)=h*s(i,j); %GLPF濾波後的頻域表示
end
end
img_i2=ifft2(ifftshift(s));img_i2=exp(img_i2);img_i2=uint8(real(img_i2));
%--------------------------------------------------------------------------
newImg(:,:,1)=img(:,:,1);newImg(:,:,2)=img_s2;newImg(:,:,3)=img_i2;
subplot(122),imshow(newImg);
E. photoshop 怎麼實現直方圖均衡化
圖形處理中有一種對比度變換,像顯示器就有對比度調節,PhotoShop也有圖片的對比度修改,對比度的提高可以使圖像細節清晰,相反,對比度的減小可以隱藏圖像的細節,在一定程度上使圖像柔和。
對比度變換其中一種比較簡單的方法是直方圖均衡化。
所謂直方圖就是在某一灰度級的象素個數占整幅圖像的象素比 h=nj/N,其中nj是灰度級在j的象素數,N是總象素數,掃描整幅圖像得出的h的離散序列就是圖像的直方圖,h求和必然=1,所以直方圖可以看成是象素對於灰度的概率分布函數。
直方圖是高低不齊的,因為象素灰度是隨機變化的,直方圖均衡化就是用一定的演算法使直方圖大致平和。
演算法如下:
對於一個直方圖
設 Pr(r)是原始圖像直方圖,Ps(s)是均衡化的直方圖,
由於其是一個概率分布函數
所以有 Ps(s)ds=Pr(r)dr (編輯關系,ds,dr是積分變數)
因為要進行均衡化,令 Ps(s)=1,
得 ds=Pr(r)dr/1
兩邊積分得 s=F Pr(r)dr (因為編輯關系,左邊F表示積分符號....-__-++)
數字圖像是離散的,因此離散化上式得
sk=E{j=0,k}(nj/N) 左式k,j是離散量下標,因為編輯關系,E{0,k}表示下標0到k的連加符號,N是象素總數
由此得出每一象素的sk為均衡化後的正規化灰度(即灰度正規化到[0,1]),統計sk即可得出均衡化後的直方圖。
在均衡化過程中可以對每一象素映射到新的實際灰度值sk*255,就實現了圖像的變換
(嚴格理論中應該是灰度正規化到[0,1]區間,然後均衡化後的sk還要量化到原始的正規灰度以實現灰度合並,下面的BCB程序並沒有量化,而且255是固定灰度級,因為256色BMP的彩色表就是256個表項)
現在開始實踐
用BCB對一BMP灰度圖像進行直方圖均衡化處理,代碼如下
//----------------------------BCB6代碼
#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include "Unit1.h"
#include"File1.h"
#pragma pack(1)
//BMP文件頭
struct BITMAPFILEHEADER_
{
short type;
int bfSize;
short re1,re2;
int Offbits;
};
//BMP信息頭
struct BITMAPINFO_
{
long size;
long width,height;
short planes,bitCount;
long comp,sizeImg;
long xpels,ypels;
long used,important;
};
//BMP彩色表項
struct COLOR_
{
char blue,green,red,re;
};
//------將BMP彩色表的數據校正到BCB TColor的數據。
void SwitchColor(long &c)
{
long blue=c& 0x000000ff;
long green=c& 0x0000ff00;
long red=c& 0x00ff0000;
c=(blue<<16) | green | (red>>16);
}
void xxx()
{
FILE *f=fopen("f:\\bbs_prev2.bmp","rb");
if(f==NULL) /*判斷文件是否打開成功*/
{
ShowMessage("File open error");
return;
}
fseek(f,0,0);//移動到開頭
//----------讀BMP文件頭
BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_();
if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL)
{
ShowMessage("File read error");
return;
}
//-----------讀BMP信息頭
BITMAPINFO_ *bmpi=new BITMAPINFO_();
if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL)
{
ShowMessage("File read error2");
return;
}
//--------------讀彩色表
long *c=new long[bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_)];
fread((char*)c,bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_),1,f);
//----------顯示一些信息
Form1->Edit1->Text=IntToStr(bmph->bfSize);
Form1->Edit2->Text=IntToStr(bmpi->width);
Form1->Edit3->Text=IntToStr(bmpi->height);
Form1->Edit4->Text=IntToStr(bmpi->comp);
Form1->Edit5->Text=IntToStr(bmpi->used);
int i,j,k,wc;
long N=bmph->bfSize- bmph->Offbits;//象素總數
unsigned char *image=new char[N]; //點陣圖矩陣
unsigned char *newimage=new char[N];//變換後的點陣圖矩陣
fread(image,N,1,f);//讀入點陣圖矩陣
//---------直方圖數列初始化
//---------直方圖數列用來存儲正規化後的灰度
double *h=new double[255];//255個灰度級,保存原始圖像正規化灰度直方圖數據
for(i=0;i<255;i++)
h[i]=0.0;
double *nh=new double[255];//255個灰度級,保存變換後的圖像正規化灰度直方圖
for(i=0;i<255;i++)
nh[i]=0.0;
long *count=new long[255]; //每一灰度級的象素數量統計
for(i=0;i<255;i++)
count[i]=0;
for(i=0;i<N;i++)
{
count[image[i]]++;
}
//-----正規化灰度概率統計
for(i=0;i<255;i++)
{
h[i]=count[i]/(double)N;
}
//------正規化新灰度圖
double hc;
for(i=0;i<N;i++)
{
hc=0;
for(j=0;j<image[i];j++)
hc+=h[j];
nh[image[i]]+=hc; //保存新正規化灰度圖
newimage[i]=hc*255; //保存新圖像灰度索引
}
//----------顯示直方圖
for(i=0;i<255;i++)
{
//原始直方圖
Form1->Canvas->MoveTo(10+i,200);
Form1->Canvas->LineTo(10+i,200+h[i]*N);
//新直方圖
Form1->Canvas->MoveTo(300+i,200);
Form1->Canvas->LineTo(300+i,200+nh[i]*255);
}
//------顯示圖形
TColor *tc;
if(bmpi->width%4==0)//-----------因為BMP圖像4位元組對齊
wc=bmpi->width/4*4;
else
wc=(bmpi->width/4+1)*4;
long a;
long pos=0;
for( i=0;i<bmpi->height;i++)
{
for(j=0;j<wc;j++)
{
//-----原始圖形
a= c[image[pos]];
SwitchColor(a);
Form1->Canvas->Pixels[10+j][600-i]=a;
//------新圖形
a= c[newimage[pos]];
SwitchColor(a);
Form1->Canvas->Pixels[300+j][600-i]=a;
pos++;
}
}
fclose(f);
}
這個程序使用256色BMP文件,但程序代碼是針對灰度圖像的,用於彩色圖像時得出一些古怪色彩配合而已。
在對灰度圖像均衡化時
如果原始圖像對比度本來就很高,如果再均衡化則灰度調和,對比度降低。
在泛白緩和的圖像中,由於均衡化過程中會合並一些象素灰度,則會增大對比度,這里255灰度級太多,合並不明顯。
http://hi..com/j_fo/blog/item/09a6adc3f8078855b319a8ac.html
還有詳細的說明和圖解
F. matlab里直方圖均衡化用什麼函數
你好,
matlab直方圖均衡化的函數只有一個histeq,就是你說的那個。它是用於圖像處理的。如果你的直方圖不是圖像處理的直方圖,請給我短消息,我可以把演算法給你。
histeq的作用是把「圖像」的直方圖均衡化。
簡單的說,有些圖像有太多的亮點或者有太多的暗點。histeq通過一個演算法,把亮度重新分配,讓人看得舒服自然。比如說原來的點都集中在暗處,1-25之間,histeq就可以把25亮度的點「拉」到255處,24「拉」到240處..最後圖像的細
G. 為什麼POSHE均衡化演算法程序出現的圖像是黑色的
直方圖均衡化是專門對於灰度圖像而言的處理演算法,所以你得先轉化為灰度圖像,具體程序如下: a=imread('e:\b.jpg');%讀取圖像 b=rgb2gray(a); %轉化為灰度圖像 imshow(b); %顯示原圖 c=histeq(b); %直方圖均衡化 subplot(121),imshow(a); subplo
H. 直方圖均衡化處理的主要步驟是什麼
設原始圖像在(x,y)處的灰度為f,而改變後的圖像為g,則對圖像增強的方法可表述為將在(x,y)處的灰度f映射為g。
在灰度直方圖均衡化處理中對圖像的映射函數可定義為:g = EQ (f)。
這個映射函數EQ(f)必須滿足兩個條件(其中L為圖像的灰度級數):
(1)EQ(f)在0≤f≤L-1范圍內是一個單值單增函數。這是為了保證增強處理沒有打亂原始圖像的灰度排列次序,原圖各灰度級在變換後仍保持從黑到白(或從白到黑)的排列。
(2)對於0≤f≤L-1有0≤g≤L-1,這個條件保證了變換前後灰度值動態范圍的一致性。
(8)圖像均衡化演算法擴展閱讀:
直方圖均衡化作用
這種方法通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分布。
這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。
這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景雜訊的對比度並且降低有用信號的對比度。
在統計學中,直方圖(英語:Histogram)是一種對數據分布情況的圖形表示,是一種二維統計圖表,它的兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量。直方圖是品質管理七大工具之一。
把直方圖上每個屬性的計數除以所有屬性的計數之和,就得到了歸一化直方圖。之所以叫「歸一」,是因為歸一化直方圖的所有屬性的計數之和為1,也就是說,每個屬性對應計數都是0到1之間的一個數(百分比)。
參考資料來源:網路-直方圖均衡化
I. 說明直方圖匹配與直方圖均衡兩種處理演算法原理的區別.考慮在什麼情況
首先需要說明的是,如果你說的是一道完整的題目,則這道題目沒有唯一解,因為題目中沒有說明原始圖像的灰度級數(比如原始圖像是16個灰度級的,或者是32個灰度級的,等等)。為了給你提供一個解題思路,現在人為假設原始圖像是16個灰度級的,其它灰度級的解法類似。1、圖像的灰度直方圖求法為:(1)先計算圖像中各個灰度級的出現頻率,用h(i)表示灰度級i的出現頻率,其值等於灰度級出現次數/圖像像素個數:h(0)=2/16h(1)=1/16h(2)=3/16h(3)=2/16h(4)=0/16h(5)=1/16h(6)=4/16h(7)=1/16h(8)=1/16h(9)=1/16h(10)=h(11)=h(12)=h(13)=h(14)=h(15)=0/16。然後以灰度級i為橫軸,出現頻率h(i)為縱軸即可繪制出圖像對應的直方圖。(2)圖像進行直方圖均衡化處理的過程為:先計算累積分布,用r(i)表示灰度級i的累積分布:r(0)=h(0)=2/16r(1)=r(0)+h(1)=2/16+1/16=3/16r(2)=r(1)+h(2)=3/16+3/16=6/16r(3)=r(2)+h(3)=6/16+2/16=8/16r(4)=r(3)+h(4)=8/16+0/16=8/16r(5)=r(4)+h(5)=8/16+1/16=9/16r(6)=r(5)+h(6)=9/16+4/16=13/16r(7)=r(6)+h(7)=13/16+1/16=14/16r(8)=r(7)+h(8)=14/16+1/16=15/16r(9)=r(8)+h(9)=15/16+1/16=16/16=1r(10)=r(11)=r(12)=r(13)=r(14)=r(15)=1將累積分布進行量化(量化時需要用到原始圖像的灰度級數,這也是為什麼前面需要說明的原因),量化後的灰度級用rq(i)表示,量化公式為rq(i)=ROUND(r(i)*15),(說明:量化公式中的15等於原始圖像灰度級數減1),可得:rq(0)=ROUND(r(0)*15)=2rq(1)=ROUND(r(1)*15)=3rq(2)=ROUND(r(2)*15)=6rq(3)=ROUND(r(3)*15)=8rq(4)=ROUND(r(4)*15)=8rq(5)=ROUND(r(5)*15)=8rq(6)=ROUND(r(6)*15)=12rq(7)=ROUND(r(7)*15)=13rq(8)=ROUND(r(8)*15)=14rq(9)=ROUND(r(9)*15)=15rq(10)=ROUND(r(10)*15)=15rq(11)=ROUND(r(11)*15)=15rq(12)=ROUND(r(12)*15)=15rq(13)=ROUND(r(13)*15)=15rq(14)=ROUND(r(14)*15)=15rq(15)=ROUND(r(15)*15)=15因此,原始圖像中的灰度級和均化後圖像中的灰度級之間的對應關系為:0->21->32->63->84->85->86->127->138->149->1510->1511->1512->1513->1514->1515->15將原始圖像中對應的灰度值安裝上述對應關系替換成相應的灰度值,即可得到均化圖像,結果如下:38138612212146128156122(在電腦上直接做的,僅供參考。ROUND(.)表示四捨五入。)
J. 數字圖像處理問題(編程實現直方圖均衡化演算法)
C實現的,matlab裡面就更簡單了
//LPSTR lpDIBBits - 指向源DIB圖像指針
//LONG lWidth - 源圖像寬度(象素數)
//LONG lHeight - 源圖像高度(象素數)
BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源圖像的指針
unsigned char* lpSrc;
// 臨時變數
LONG lTemp;
// 循環變數
LONG i;
LONG j;
// 灰度映射表
BYTE bMap[256];
// 灰度映射表
LONG lCount[256];
// 圖像每行的位元組數
LONG lLineBytes;
// 計算圖像每行的位元組數
lLineBytes = WIDTHBYTES(lWidth * 8);
// 重置計數為0
for (i = 0; i < 256; i ++)
{
// 清零
lCount[i] = 0;
}
// 計算各個灰度值的計數
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lWidth; j ++)
{
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;
// 計數加1
lCount[*(lpSrc)]++;
}
}
// 計算灰度映射表
for (i = 0; i < 256; i++)
{
// 初始為0
lTemp = 0;
for (j = 0; j <= i ; j++)
{
lTemp += lCount[j];
}
// 計算對應的新灰度值
bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth);
}
// 每行
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
// 指向DIB第i行,第j個象素的指針
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 計算新的灰度值
*lpSrc = bMap[*lpSrc];
}
}
// 返回
return TRUE;
}