【From】http://blog.youkuaiyun.com/zhoufan900428/article/details/12709361
灰度变换,属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验与数学式都采用了8-bit 图像的灰度范围,也就是0到255这样一个范围,这是本书不合理的一个地方。首先,这样做并不泛用,图片不一定是8-bit的。其次,在做某些变换的时候,可能会导致溢出。比如,伽马变化,假设伽马值为2,那么灰度为255的像素点,其变换之后值为65025,这里就溢出了。当然,要是使用Matlab计算,肯定会处理的非常好,直接使用mat2gray函数就能将其压缩回0到255。但是要是其他嵌入式平台处理的时候,直接套用不方便不说,直接按照8-bit的图来理解很不直观。因此,我将数学式做了改变,让其输入为0到1的浮点数,其输出也是0到1的浮点数,这样方便理解。
本文所使用的图片,均来源于《Digital Image Processing》的主页 http://www.imageprocessingplace.com/
图像反转
- close all;
- clear all;
- %% -------------Log Transformations-----------------
- f = imread('DFT_no_log.tif');
- f = mat2gray(f,[0 255]);
- v = 10;
- g_1 = log2(1 + v*f)/log2(v+1);
- v = 30;
- g_2 = log2(1 + v*f)/log2(v+1);
- v = 200;
- g_3 = log2(1 + v*f)/log2(v+1);
- figure();
- subplot(1,2,1);
- imshow(f,[0 1]);
- xlabel('a).Original Image');
- subplot(1,2,2);
- imshow(g_1,[0 1]);
- xlabel('b).Log Transformations v=10');
- figure();
- subplot(1,2,1);
- imshow(g_2,[0 1]);
- xlabel('c).Log Transformations v=100');
- subplot(1,2,2);
- imshow(g_3,[0 1]);
- xlabel('d).Log Transformations v=200');
伽马变换
- close all;
- clear all;
- %% -------------Gamma Transformations-----------------
- f = imread('fractured_spine.tif');
- f = mat2gray(f,[0 255]);
- C = 1;
- Gamma = 0.4;
- g2 = C*(f.^Gamma);
- figure();
- subplot(1,2,1);
- imshow(f,[0 1]);
- xlabel('a).Original Image');
- subplot(1,2,2);
- imshow(g2,[0 1]);
- xlabel('b).Gamma Transformations \gamma = 0.4');
灰度拉伸
- g = mat2gray(g,[1/(1+(m/eps)^E) 1/(1+(m/1+eps)^E)]);
- close all;
- clear all;
- %% -------------Contrast Stretching-----------------
- f = imread('washed_out_pollen_image.tif');
- %f = imread('einstein_orig.tif');
- f = mat2gray(f,[0 255]);
- [M,N] = size(f);
- g = zeros(M,N);
- Min_f = min(min(f));
- Max_f = max(max(f));
- m = (Min_f + Max_f)/2;
- Out_put_min = 0.05;
- Out_put_max = 0.95;
- E_1 = log(1/Out_put_min - 1)/log(m/(Min_f+eps));
- E_2 = log(1/Out_put_max - 1)/log(m/(Max_f+eps));
- E = ceil(min(E_1,E_2)-1);
- g = 1 ./(1 + (m ./ (f+ eps)).^E);
- g = mat2gray(g,[1/(1+(m/eps)^E) 1/(1+(m/1+eps)^E)]);
- figure();
- subplot(2,2,1);
- imshow(f,[0 1]);
- xlabel('a).Original Image');
- subplot(2,2,2);
- r = imhist(f)/(M*N);
- bar(0:1/255:1,r);
- axis([0 1 0 max(r)]);
- xlabel('b).The Histogram of a');
- ylabel('Number of pixels');
- subplot(2,2,3);
- imshow(g,[0 1]);
- xlabel('c).Results of Contrast stretching');
- subplot(2,2,4);
- s = imhist(g)/(M*N);
- bar(0:1/255:1,s);
- axis([0 1 0 max(s)]);
- xlabel('b).The Histogram of a');
- ylabel('Number of pixels');
- in_put = 0:1/255:1;
- Out_put1 = 1 ./(1 + (m ./ (double(in_put)+ eps)).^E);
- Out_put1 = mat2gray(Out_put1,[1/(1+(m/eps)^E) 1/(1+(m/1+eps)^E)]);
- figure();
- plot(in_put,Out_put1);
- axis([0,1,0,1]),grid;
- axis square;
- xlabel('Input intensity level');
- ylabel('Onput intensity level');