本文目錄一覽:
- 1、直方圖均衡化步驟?
- 2、誰有部分子塊重疊局部直方圖均衡的程序,即poshe演算法,謝謝,下面是poshe演算法的步驟
- 3、用c語言編寫一個程序,列印輸入單詞的長度的直方圖?
- 4、求一個直方圖均衡化的程序
- 5、用C語言編寫灰度圖像直方圖變換增強
- 6、C語言繪製直方圖(C程序設計語言習題1-13)
直方圖均衡化步驟?
這個足夠了 有問題再留言
clear all
%一,圖像的預處理,讀入彩色圖像將其灰度化
PS=imread(‘s7.jpg’); %讀入JPG彩色圖像文件 ,注意路徑
figure(1);subplot(2,2,1);imshow(PS);title(‘原圖像灰度圖’);
%二,繪製直方圖
[m,n]=size(PS); %測量圖像尺寸參數
GP=zeros(1,256); %預創建存放灰度出現概率的向量
for k=0:255
GP(k+1)=length(find(PS==k))/(m*n); %計算每級灰度出現的概率,將其存入GP中相應位置
end
figure(1);subplot(2,2,2);bar(0:255,GP,’g’) %繪製直方圖
title(‘原圖像直方圖’)
xlabel(‘灰度值’)
ylabel(‘出現概率’)
%三,直方圖均衡化
S1=zeros(1,256);
for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %計算Sk
end
end
S2=round((S1*256)+0.5); %將Sk歸到相近級的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %計算現有每個灰度級出現的概率
end
figure(1);subplot(2,2,4);bar(0:255,GPeq,’b’) %顯示均衡化後的直方圖
title(‘均衡化後的直方圖’)
xlabel(‘灰度值’)
ylabel(‘出現概率’)
%四,圖像均衡化
PA=PS;
for i=0:255
PA(find(PS==i))=S2(i+1); %將各個像素歸一化後的灰度值賦給這個像素
end
figure(1);subplot(2,2,3);imshow(PA) %顯示均衡化後的圖像
title(‘均衡化後圖像’)
imwrite(PA,’PicEqual.bmp’);
誰有部分子塊重疊局部直方圖均衡的程序,即poshe演算法,謝謝,下面是poshe演算法的步驟
clear;
I = imread(‘E:\ebook\lena.bmp’);
figure,imshow(I),title(‘original image’);
len = 5;
hstep = 2;
wstep = 2;
for k = 1:size(I,3)
img = I(:,:,k);
img = [img(:,len:-1:2) img img(:,end-1:-1:end-len)];
img = [img(len:-1:2,:) ;img; img(end-1:-1:end-len,:)];%%其實就是圖像擴展,參考wextend函數,當然你的方法也可以
[h w] = size(img);
med_out(:,:,k) = int16(zeros(h,w));%%轉化成int16型數據,原因下面會說明
counts = zeros(h,w);
for i =1:hstep:h
if h-i = len
for j = 1:wstep:w
if w-j = len
rect =int16(histeq(img(i:i+len-1,j:j+len-1)));%同樣轉化成int16類型
med_out(i:i+len-1,j:j+len-1,k) =med_out(i:i+len-1,j:j+len-1,k)+rect;%%rect和med_out轉化成int16類型原因在於,你的med_out計算直方圖均衡化並且把重複的像素的直方圖均衡化結果進行累加,那麼其累加的值很有可能超過255,所以你轉化med_out為uint8型是不夠的,它會把超過255的值強製為255。
counts(i:i+len-1,j:j+len-1) = counts(i:i+len-1,j:j+len-1)+1;
end
end
end
end
med_out1(:,:,k) = double(med_out(len:end-len,len:end-len,k));%%這裡對圖像兩邊各擴展了四個像素,所以起始位置應該是len,而不是len+1,同樣結束就是end-len
med_out1(:,:,k) = med_out1(:,:,k)./counts(len:end-len,len:end-len);
out(:,:,k) = uint8(med_out1(:,:,k));%%轉化成uint8型
end
figure,imshow(out),title(‘poshe result’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
這樣改就可以了,運行後可以出結果,圖片就不貼了!!
編程時要考慮數據範圍是否過界的問題。
用c語言編寫一個程序,列印輸入單詞的長度的直方圖?
/*
練習1.13;
編寫一個程序,列印輸入中長度的直方圖。
*/
# include stdio.h
# define MAXHIST 15 //最大長度的直方圖
# define MAXWORD 11 //一個單詞的最大長度
# define IN 1 //文字內
# define OUT 0 //外一個單詞
/*列印水平直方圖*/
int main(void)
{
int c,i,nc,state;
int len; //每條的長度
int maxvalue; //最大者為
int ovflow; //數量的溢出的話
int wl[MAXWORD]; //單詞長度計數器
state = OUT;
nc = 0; //在一個單詞字元的數量
ovflow = 0; //字數 = MAXWORD
for(i = 0;i MAXWORD; ++i)
wl[i] = 0;
while ((c = getchar()) != EOF)
{
if (c == ‘ ‘ || c == ‘\n’ || c == ‘\t’)
{
state = OUT;
if(nc 0)
if(nc MAXWORD) //如果nc小於11則wl[nc]元素加一
++wl[nc];
else //否則ovflow加一
++ovflow;
nc = 0;
}
else if (state == OUT)
{
state = IN;
nc = 1; //開始一個新單詞
}
else
++nc; //文字內
}
maxvalue = 0;
for (i = 1; i MAXWORD; ++i)
if(wl[i] maxvalue)
maxvalue = wl[i];
for (i = 1; i MAXWORD; ++i)
{
printf(“%5d – %5d : “,i,wl[i]);
if(wl[i] 0)
{
if ((len = wl[i] * MAXHIST / maxvalue) = 0)
len = 1;
}
else
len = 0;
while (len 0)
{
putchar(‘*’);
–len;
}
putchar(‘\n’);
}
if (ovflow 0)
printf(“There are %d words = %d\n”,ovflow,MAXWORD);
return 0;
}
求一個直方圖均衡化的程序
圖形處理中有一種對比度變換,像顯示器就有對比度調節,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
#includestdio.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=(blue16) | green | (red16);
}
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;i255;i++)
h[i]=0.0;
double *nh=new double[255];//255個灰度級,保存變換後的圖像正規化灰度直方圖
for(i=0;i255;i++)
nh[i]=0.0;
long *count=new long[255]; //每一灰度級的象素數量統計
for(i=0;i255;i++)
count[i]=0;
for(i=0;iN;i++)
{
count[image[i]]++;
}
//-----正規化灰度概率統計
for(i=0;i255;i++)
{
h[i]=count[i]/(double)N;
}
//——正規化新灰度圖
double hc;
for(i=0;iN;i++)
{
hc=0;
for(j=0;jimage[i];j++)
hc+=h[j];
nh[image[i]]+=hc; //保存新正規化灰度圖
newimage[i]=hc*255; //保存新圖像灰度索引
}
//———-顯示直方圖
for(i=0;i255;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;ibmpi-height;i++)
{
for(j=0;jwc;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灰度級太多,合併不明顯。
用C語言編寫灰度圖像直方圖變換增強
參考一下這個程序:
#define IMAGEWIDTH 80
#define IMAGEHEIGHT 80
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256]);
void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256]);
unsigned char dbImage[IMAGEWIDTH*IMAGEHEIGHT];
unsigned char dbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
float fHistogram[256],fHistogram1[256];
unsigned char lut[256];
/* 直方圖統計程序 */
int main()
{
… //準備一幅灰度圖片到dbImage
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram); //做直方圖統計
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1); //直方圖增強輸出到dbTargetImage
…//完成後顯示
}
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])
{
int i,j;
unsigned int uWork;
unsigned char *pWork;
for ( i=0;i256;i++ ) fHisto[i]=0.0f;
pWork=pImage;
for ( i=0;inHeight;i++ )
{
for ( j=0;jnWidth;j++,pWork++ )
{
uWork=(unsigned int)(*pWork);
fHisto[uWork]++;
}
}
uWork=nWidth*nHeight;
for ( i=0;i256;i++ )
{
fHisto[i]/=uWork;
fHisto[i]*=100;
}
}
void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256])
{
int i,j;
unsigned int uWork;
unsigned char *pWork,*pWork1;
for ( i=0;i256;i++ )
fHisto1[i]=fHisto[i]/100;
for ( i=1;i256;i++ )
fHisto1[i]+=fHisto1[i-1];
for ( i=0;i256;i++ )
lut[i]=fHisto1[i]*256;
for ( i=0;i256;i++ )
if ( lut[i]=256 )
lut[i]=255;
pWork=pImage; pWork1=pImage1;
for ( i=0;inHeight;i++ )
for ( j=0;jnWidth;j++,pWork++,pWork1++ )
(*pWork1)=lut[(*pWork)];
}
C語言繪製直方圖(C程序設計語言習題1-13)
你好,大概看了一下,這個好像是統計一段文字中單詞的長度並繪製直方圖。這裡wl就是用來記錄單詞長度的。wl[i] = j 代表長度為i的單詞有j個。
比如最開始,wl數組全是0:
wl = [0, 0, 0, 0, …]
這個時候我們讀入了一個長度為2的單詞,於是wl[2]++,數組變成:(注意數組下標從0開始)
wl = [0, 0, 1, 0, …]
如此往複就記錄了所有單詞的長度統計。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/257199.html