久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

數(shù)字圖像處理,經(jīng)典對比度增強(qiáng)算法

 萬書草堂 2018-04-24

關(guān)于圖像增強(qiáng)必須清楚的基本概念

1.圖像增強(qiáng)的目的:

1)改善圖像的視覺效果,,
2)轉(zhuǎn)換為更適合于人或機(jī)器分析處理的形式
3)突出對人或機(jī)器分析有意義的信息
4)抑制無用信息,,提高圖像的使用價值
5)增強(qiáng)后的圖像并不一定保真


2,圖像增強(qiáng)的方法分類:

1)從處理對象分類:灰度圖像,,(偽)彩色圖像
2)從處理策略分類:全局處理,局部處理(ROI ROI,,Region of Interest Interest)
3)從處理方法分類:空間域(點(diǎn)域運(yùn)算,,即灰度變換;鄰域方法,,即空域?yàn)V波),,頻域方法
4)從處理目的分類:圖像銳化,平滑去噪,,灰度調(diào)整(對比度增強(qiáng))


3,,圖像增強(qiáng)的方法之對比度增強(qiáng)

1)灰度變換法

線性變換(已實(shí)現(xiàn))
對數(shù)變換(已實(shí)現(xiàn))
指數(shù)變換(已實(shí)現(xiàn))

2)直方圖調(diào)整法
直方圖均衡化(已實(shí)現(xiàn))
直方圖匹配(未實(shí)現(xiàn))



一,直方圖均衡化 

直方圖均衡化的英文名稱是Histogram Equalization. 

  圖像對比度增強(qiáng)的方法可以分成兩類:一類是直接對比度增強(qiáng)方法;另一類是間接對比度增強(qiáng)方法,。直方圖拉伸和直方圖均衡化是兩種最常見的間接對比度增強(qiáng)方法,。直方圖拉伸是通過對比度拉伸對直方圖進(jìn)行調(diào)整,從而“擴(kuò)大”前景和背景灰度的差別,,以達(dá)到增強(qiáng)對比度的目的,,這種方法可以利用線性或非線性的方法來實(shí)現(xiàn);直方圖均衡化則通過使用累積函數(shù)對灰度值進(jìn)行“調(diào)整”以實(shí)現(xiàn)對比度的增強(qiáng)。
  直方圖均衡化處理的“中心思想”是把原始圖像的灰度直方圖從比較集中的某個灰度區(qū)間變成在全部灰度范圍內(nèi)的均勻分布,。直方圖均衡化就是對圖像進(jìn)行非線性拉伸,,重新分配圖像像素值,使一定灰度范圍內(nèi)的像素數(shù)量大致相同,。直方圖均衡化就是把給定圖像的直方圖分布改變成“均勻”分布直方圖分布,。
  缺點(diǎn): 
  1)變換后圖像的灰度級減少,某些細(xì)節(jié)消失,; 
  2)某些圖像,,如直方圖有高峰,經(jīng)處理后對比度不自然的過分增強(qiáng),。 
  直方圖均衡化是圖像處理領(lǐng)域中利用圖像直方圖對對比度進(jìn)行調(diào)整的方法,。 
  這種方法通常用來增加許多圖像的局部對比度,尤其是當(dāng)圖像的有用數(shù)據(jù)的對比度相當(dāng)接近的時候,。通過這種方法,,亮度可以更好地在直方圖上分布。這樣就可以用于增強(qiáng)局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴(kuò)展常用的亮度來實(shí)現(xiàn)這種功能,。
  這種方法對于背景和前景都太亮或者太暗的圖像非常有用,,這種方法尤其是可以帶來X光圖像中更好的骨骼結(jié)構(gòu)顯示以及曝光過度或者曝光不足照片中更好的細(xì)節(jié)。這種方法的一個主要優(yōu)勢是它是一個相當(dāng)直觀的技術(shù)并且是可逆操作,,如果已知均衡化函數(shù),,那么就可以恢復(fù)原始的直方圖,并且計算量也不大,。這種方法的一個缺點(diǎn)是它對處理的數(shù)據(jù)不加選擇,,它可能會增加背景雜訊的對比度并且降低有用信號的對比度。
  

關(guān)于編程實(shí)現(xiàn),,同樣是不調(diào)用matlab庫函數(shù),,自己編程實(shí)現(xiàn)。這樣可以更深刻地理解直方圖均衡化技術(shù),,提高編程能力,。

實(shí)現(xiàn)代碼(matlab):


  1. clc;  
  2. close all;  
  3. clear all;  
  4.    
  5. src_img = imread('flyman_gray.bmp');    
  6.   
  7. figure (1)   
  8. subplot(321),imshow(src_img),title('原圖像');%顯示原始圖像    
  9. subplot(322),imhist(src_img),title('原圖像直方圖');%顯示原始圖像直方圖    
  10.   
  11. matlab_eq=histeq(src_img);         %利用matlab的函數(shù)直方圖均衡化  
  12. subplot(323),imshow(matlab_eq),title('matlab直方圖均衡化原圖像');%顯示原始圖像    
  13. subplot(324),imhist(matlab_eq),title('matlab均衡化后的直方圖');%顯示原始圖像直方圖   
  14.   
  15. dst_img=myHE(src_img);             %利用自己寫的函數(shù)直方圖均衡化  
  16. subplot(325),imshow(dst_img),title('手寫均衡化效果');%顯示原始圖像    
  17. subplot(326),imhist(dst_img),title('手寫均衡化直方圖');%顯示原始圖像直方圖   

直方圖均衡化函數(shù)的實(shí)現(xiàn):


  1. function dst_img=myHE(src_img)    
  2.   
  3. [height,width] = size(src_img);  
  4. dst_img=uint8(zeros(height,width));  
  5. %進(jìn)行像素灰度統(tǒng)計;      
  6. NumPixel = zeros(1,256);%統(tǒng)計各灰度數(shù)目,共256個灰度級      
  7. for i = 1:height      
  8.     for j = 1: width      
  9.         NumPixel(src_img(i,j) + 1) = NumPixel(src_img(i,j) + 1) + 1;%對應(yīng)灰度值像素點(diǎn)數(shù)量增加一      
  10.     end      
  11. end      
  12. %計算灰度分布密度      
  13. ProbPixel = zeros(1,256);      
  14. for i = 1:256      
  15.     ProbPixel(i) = NumPixel(i) / (height * width * 1.0);      
  16. end      
  17. %計算累計直方圖分布      
  18. CumuPixel = zeros(1,256);      
  19. for i = 1:256      
  20.     if i == 1      
  21.         CumuPixel(i) = ProbPixel(i);      
  22.     else      
  23.         CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);      
  24.     end      
  25. end      
  26.     
  27. % 指定范圍進(jìn)行均衡化    
  28. % pixel_max=max(max(I));    
  29. % pixel_min=min(min(I));    
  30. pixel_max=255;    
  31. pixel_min=0;    
  32. %對灰度值進(jìn)行映射(均衡化)      
  33. for i = 1:height      
  34.     for j = 1: width      
  35.         dst_img(i,j) = CumuPixel(src_img(i,j)+1)*(pixel_max-pixel_min)+pixel_min;      
  36.     end      
  37. end      
  38. return;  



為什們和matlab的直方圖不一樣呢,?,??



二,,指數(shù)變換

指數(shù)變換(Power-Law )的公式:S=c*R^r,通過合理的選擇c和r可以壓縮灰度范圍,,算法以c=1.0/255.0, r=2實(shí)現(xiàn)。
要做該圖像增強(qiáng)變換需要先做歸一化,,再指數(shù)變換,,最后反歸一化
增強(qiáng)效果展示:可以看見,改增強(qiáng)算法并不能很好的將像素盡可能的碾平,。
指數(shù)增強(qiáng)參考程序?yàn)椋?/span>
  1. clc;  
  2. close all;  
  3. clear all;   
  4.      
  5. % -------------Gamma Transformations-----------------    
  6. %f = imread('Fig0316(4)(bottom_left).tif');     
  7. f = imread('seed.tif');     
  8. Gamma = 0.4;    
  9. g2 = myExpEnhance(f,Gamma);    
  10.   
  11. figure();    
  12. subplot(221);  imshow(f);  xlabel('a).Original Image');    
  13. subplot(222),imhist(f),title('原圖像直方圖');%顯示原始圖像直方圖    
  14. subplot(223);  imshow(g2);  xlabel('b).Gamma Transformations \gamma = 0.4');    
  15. subplot(224),imhist(g2),title('增強(qiáng)圖像直方圖');%顯示原始圖像直方圖   
指數(shù)增強(qiáng)核心函數(shù)為:
  1. function dst_img=myExpEnhance(src_img,Gamma)    
  2. src_img = mat2gray(src_img,[0 255]);%將圖像矩陣A中介于amin和amax的數(shù)據(jù)歸一化處理,, 其余小于amin的元素都變?yōu)?, 大于amax的元素都變?yōu)?,。    
  3. C = 1;    
  4. g2 = C*(src_img.^Gamma);   
  5. %反歸一化  
  6. max=255;  
  7. min=0;  
  8. dst_img=uint8(g2*(max-min)+min);  




三,,對數(shù)變換

       對數(shù)變換主要用于將圖像的低灰度值部分?jǐn)U展,將其高灰度值部分壓縮,,以達(dá)到強(qiáng)調(diào)圖像低灰度部分的目的,。變換方法由下式給出。

這里的對數(shù)變換,,底數(shù)為(v+1),,實(shí)際計算的時候,需要用換底公式,。其輸入范圍為歸一化的【0-1】,,其輸出也為【0-1】。對于不同的底數(shù),其對應(yīng)的變換曲線如下圖所示,。

底數(shù)越大,,對低灰度部分的強(qiáng)調(diào)就越強(qiáng),對高灰度部分的壓縮也就越強(qiáng),。相反的,,如果想強(qiáng)調(diào)高灰度部分,則用反對數(shù)函數(shù)就可以了,??聪旅娴膶?shí)驗(yàn)就可以很直觀的理解,下圖是某圖像的二維傅里葉變換圖像,,其為了使其灰度部分較為明顯,,一般都會使用灰度變換處理一下。

效果圖:


參考代碼:
  1. clc;  
  2. close all;  
  3. clear all;   
  4.   
  5. %-------------Log Transformations-----------------  
  6. f = imread('seed.tif');  
  7.   
  8. g_1 = myLogEnhance(f,10);  
  9. g_2 = myLogEnhance(f,100);  
  10. g_3 = myLogEnhance(f,200);  
  11.   
  12. figure();  
  13. subplot(2,2,1);  
  14. imshow(f);xlabel('a).Original Image');  
  15.   
  16. subplot(2,2,2);  
  17. imshow(g_1);xlabel('b).Log Transformations v=10');  
  18.   
  19. subplot(2,2,3);  
  20. imshow(g_2);xlabel('c).Log Transformations v=100');  
  21.   
  22. subplot(2,2,4);  
  23. imshow(g_3);  
  24. xlabel('d).Log Transformations v=200');  

對數(shù)變換核心函數(shù)
  1. function dst_img=myLogEnhance(src_img,v)   
  2. c=1.0;  
  3. src_img = mat2gray(src_img,[0 255]);  
  4. g =c*log2(1 + v*src_img)/log2(v+1);  
  5. %反歸一化  
  6. max=255;  
  7. min=0;  
  8. dst_img=uint8(g*(max-min)+min);  





四,,灰度拉伸

灰度拉伸也用于強(qiáng)調(diào)圖像的某個部分,與伽馬變換與對數(shù)變換不同的是,,灰度拉升可以改善圖像的動態(tài)范圍,。可以將原來低對比度的圖像拉伸為高對比度圖像,。實(shí)現(xiàn)灰度拉升的方法很多,,其中最簡單的一種就是線性拉伸。而這里介紹的方法稍微復(fù)雜一些,?;叶壤焖脭?shù)學(xué)式如下所示。

同樣的,,其輸入r為【0-1】,,其輸出s也為【0-1】。這個式子再熟悉不過了,,跟巴特沃斯高通濾波器像極了,,其輸入輸出關(guān)系也大致能猜到是個什么形狀的。但是,,這里就出現(xiàn)一個問題了,,輸入為0時候,式子無意義了,。所以,,在用Matlab計算的時候,將其變?yōu)槿缦滦问健?/span>

這里的eps,,就是Matlab里面,,一個很小數(shù)。如此做的話,式子變得有意義了,。但是,,其輸入范圍為【0-1】的時候,其輸出范圍變?yōu)榱?span style="border-width:initial; border-color:initial">,。輸出范圍大致為【0-1】,,為了精確起見,使用mat2gray函數(shù)將其歸一化到精確的[0-1],。調(diào)用格式如下,。



五,線性拉伸

為了突出感興趣的目標(biāo)或者灰度區(qū)間,,相對抑制那些不感興趣的灰度區(qū)域,,可采用分段線性法,常用的是三段線性變換




參考程序:

  1. clc;  
  2. close all;  
  3. clear all;   
  4.   
  5. I=imread('seed.tif');   
  6. [m,n,k]=size(I);  
  7. figure (1)  
  8. imshow('seed.tif');title(' 原圖像');   
  9. mid=mean(mean(I));  
  10. %橫軸  
  11. fa=20; fb=80;  
  12. %縱軸  
  13. ga=50; gb=230;  
  14.   
  15. J=myLinearEnhance(I,fa,fb,ga,gb);  
  16. figure (2)  
  17. imshow(J);title(' 線性拉伸圖像');   
  18.   
  19. pixel_f=1:256;  
  20. pixel_g=zeros(1,256);  
  21.   
  22. %三段斜率,小于1表示該段將會被收縮  
  23. k1=double(ga/fa);   
  24. k2=(gb- ga)/(fb- fa);  
  25. k3=(256- gb)/(256- fb);  
  26. for i=1:256  
  27.     if i <= fa  
  28.         pixel_g(i)= k1*i;  
  29.     elseif fa < i && i <= fb  
  30.         pixel_g(i)= k2*( i- fa)+ ga;  
  31.     else  
  32.         pixel_g(i)= k3*( i - fb)+ gb;  
  33.     end  
  34. end  
  35. figure (3)  
  36. plot(pixel_f,pixel_g);  


核心函數(shù):

  1. function dst_img=myLinearEnhance(src_img,fa,fb,ga,gb)    
  2.   
  3. [height,width] = size(src_img);  
  4. dst_img=uint8(zeros(height,width));  
  5.   
  6. src_img=double(src_img);  
  7.   
  8. %三段斜率  
  9. k1=ga/fa;   
  10. k2=(gb- ga)/(fb- fa);  
  11. k3=(255- gb)/(255- fb);  
  12. for i=1:height  
  13.     for j=1:width  
  14.             if src_img(i,j) <= fa  
  15.                 dst_img(i,j)= k1*src_img(i,j);  
  16.             elseif fa < src_img(i,j) && src_img(i,j) <= fb  
  17.                 dst_img(i,j)= k2*( src_img(i,j)- fa)+ ga;  
  18.             else  
  19.                 dst_img(i,j)= k3*( src_img(i,j)- fb)+ gb;  
  20.             end  
  21.     end  
  22. end  
  23. dst_img=uint8(dst_img);   




附錄:

附錄網(wǎng)上的另一份講解:
直方圖均衡化算法分為三個步驟,,第一步是統(tǒng)計直方圖每個灰度級出現(xiàn)的次數(shù),,第二步是累計歸一化的直方圖,第三步是計算新的像素值,。
第一步:
for(i=0;i<height;i++)
for(j=0;j<width;j++)
n[s[i][j]]++;

for(i=0;i<L;i++)
p[i]=n[i]/(width*height);

這里,,n[i]表示的是灰度級為i的像素的個數(shù),L表示的是最大灰度級,,width和height分別表示的是原始圖像的寬度和高度,,所以,p[i]表示的就是灰度級為i的像素在整幅圖像中出現(xiàn)的概率(其實(shí)就是p[]這個數(shù)組存儲的就是這幅圖像的歸一化之后的直方圖),。
第二步:
for(i=0;i<=L;i++)
for(j=0;j<=i;j++)
c[i]+=p[j];

c[]這個數(shù)組存儲的就是累計的歸一化直方圖,。
第三步:
max=min=s[0][0];
for(i=0;i<height;i++)
for(j=0;j<width;j++)
if(max<s[i][j]){
max=s[i][j];
}else if(min>s[i][j]){
min=s[i][j];
}

找出像素的最大值和最小值。
for(i=0;i<height;i++)
for(j=0;j<width;j++)
t[i][j]=c[s[i][j]]*(max-min)+min;

t[][]就是最終直方圖均衡化之后的結(jié)果,。


收錄優(yōu)秀代碼:

這份代碼寫得不錯,,學(xué)習(xí)了,原博客地址見參考資源【3】,!

  1. #include <stdio.h>  
  2. #include <iostream>  
  3. #include "fftw3.h"  
  4. #include "string"  
  5. #include "vector"  
  6. #include <windows.h>  
  7. #include <opencv2/legacy/legacy.hpp>  
  8. #include <opencv2/nonfree/nonfree.hpp>//opencv_nonfree模塊:包含一些擁有專利的算法,,如SIFT、SURF函數(shù)源碼,。   
  9. #include "opencv2/core/core.hpp"  
  10. #include "opencv2/features2d/features2d.hpp"  
  11. #include "opencv2/highgui/highgui.hpp"  
  12. #include <opencv2/nonfree/features2d.hpp>  
  13.   
  14. using namespace cv;  
  15. using namespace std;  
  16.   
  17. class hisEqt  
  18. {  
  19. public:  
  20.     hisEqt::hisEqt();  
  21.     hisEqt::~hisEqt();  
  22. public:  
  23.     int w;  
  24.     int h;  
  25.     int nlen;  
  26.   
  27.     int *pHis;  
  28.     float *pdf;  
  29.   
  30.     //=====求像素分布概率密度====    
  31.     void  getPdf();  
  32.   
  33.     //======統(tǒng)計像素個數(shù)=======    
  34.     void getHis(unsigned char*imgdata);  
  35.   
  36.     //==========畫統(tǒng)計分布直方圖===============    
  37.     void drawHistogram(const float*pdf,Mat &hist1);    
  38.   
  39.     //===========直方圖均衡化==========    
  40.     void hisBal();  
  41.   
  42.     //====直方圖均衡化后的圖像===    
  43.     void imgBal(unsigned char* img);  
  44. };  
  45.   
  46.   
  47. hisEqt::hisEqt() :nlen(0){  
  48.     pHis = new int[256 * sizeof(int)];  
  49.     memset(pHis, 0, 256 * sizeof(int));  
  50.     pdf = new float[255 * sizeof(float)];  
  51.     memset(pdf, 0, 255 * sizeof(float));  
  52. }  
  53.   
  54. hisEqt::~hisEqt(){  
  55.     delete[]pHis;  
  56.     delete[]pdf;  
  57. }  
  58.   
  59.   
  60. //======統(tǒng)計像素個數(shù)=======    
  61. void hisEqt::getHis(unsigned char*imgdata){  
  62.     for (int i = 0; i<nlen; i++)  
  63.     {  
  64.         pHis[imgdata[i]]++;  
  65.     }  
  66. }  
  67.   
  68.   
  69. //=====求像素分布概率密度====    
  70. void hisEqt::getPdf(){  
  71.     for (int k = 0; k<256; k++)  
  72.     {  
  73.         pdf[k] = pHis[k] / float(nlen);  
  74.     }  
  75. }  
  76.   
  77. //===========直方圖均衡化==========    
  78. void hisEqt::hisBal(){  
  79.     for (int k = 1; k<256; k++)  
  80.     {  
  81.         pdf[k] += pdf[k - 1];  
  82.     }  
  83.     for (int k = 0; k<256; k++)  
  84.     {  
  85.         pHis[k] = 255 * pdf[k];  
  86.     }  
  87. }  
  88.   
  89. //====直方圖均衡化    
  90. void hisEqt::imgBal(unsigned char* img){  
  91.     for (int i = 0; i<nlen; i++)  
  92.     {  
  93.         img[i] = pHis[img[i]];  
  94.     }  
  95. }  
  96.   
  97.   
  98. void hisEqt::drawHistogram(const float *pdf, Mat& hist1){  
  99.     for (int k = 0; k<256; k++)  
  100.     {  
  101.         if (k % 2 == 0)  
  102.         {  
  103.             Point a(k, 255), b(k, 255 - pdf[k] * 2550);  
  104.             line(hist1,  
  105.                 a,  
  106.                 b,  
  107.                 Scalar(0, 0, 255),  
  108.                 1);  
  109.         }  
  110.         else  
  111.         {  
  112.             Point a(k, 255), b(k, 255 - pdf[k] * 2550);  
  113.             line(hist1,  
  114.                 a,  
  115.                 b,  
  116.                 Scalar(0, 255, 0),  
  117.                 1);  
  118.         }  
  119.     }  
  120. }  
  121.   
  122.   
  123. int main()  
  124. {  
  125.     Mat image = imread("Fig0651(a)(flower_no_compression).tif");  
  126.     if (!image.data)  
  127.         return -1;  
  128.   
  129.     Mat hist2(256, 256, CV_8UC3, Scalar(0, 0, 0));  
  130.     Mat hist1(256, 256, CV_8UC3, Scalar(0, 0, 0));  
  131.   
  132.     Mat imgOut = Mat(image.rows, image.cols, CV_8UC3, Scalar(0, 0, 0));  
  133.     vector<Mat> planes;  
  134.     int chn = image.channels();  
  135.     if (chn == 3)  
  136.     {  
  137.         split(image, planes);  
  138.     }  
  139.     while (chn)  
  140.     {  
  141.         chn--;  
  142.         unsigned char* imageData = new unsigned char[sizeof(unsigned char)*(image.cols*image.rows)];  
  143.         memcpy(imageData, planes[chn].data, planes[chn].cols*planes[chn].rows);  
  144.         hisEqt his;//自定義的類  
  145.         his.nlen = image.rows*image.cols;  
  146.         his.getHis(imageData);  
  147.         his.getPdf();  
  148.   
  149.         //  //======畫原圖直方圖并保存============    
  150.         his.drawHistogram(his.pdf, hist1);  
  151.         string pic_name = "hisline";  
  152.         pic_name = pic_name + to_string(chn);  
  153.         pic_name=pic_name+  ".jpg";  
  154.         imwrite(pic_name, hist1);  
  155.   
  156.         his.hisBal();  
  157.         his.getPdf();  
  158.         //  //======畫均衡化后直方圖并保存============    
  159.         his.drawHistogram(his.pdf, hist2);  
  160.         string pic_name0 = "his_balanceline";  
  161.         pic_name0 = pic_name0 + to_string(chn);  
  162.         pic_name0 = pic_name0 + ".jpg";  
  163.         imwrite(pic_name0, hist2);  
  164.   
  165.         //  //=====圖像均衡化===    
  166.         his.imgBal(imageData);  
  167.         memcpy(planes[chn].data, imageData, planes[chn].cols*planes[chn].rows);  
  168.         delete[] imageData;  
  169.         imageData = NULL;  
  170.     }  
  171.     merge(planes, imgOut);//單通道合并  
  172.     imwrite("result.jpg", imgOut);  
  173.     return 0;  
  174. }  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多