今天跟大家聊聊我在Matlab里捣鼓gamma函数的实践记录,这东西听起来高大上,用起来还挺有意思的。
我接到个小任务,要处理一批图像数据,听说用gamma校正能让图像看起来更舒服。当时我就懵,啥是gamma?赶紧上网查资料,大概知道gamma校正就是调整图像的亮度,让暗的地方亮起来,亮的地方暗下去,或者反过来,反正就是让图像更清晰、更符合人眼习惯。
知道概念,接下来就是实战。我得把图像读进Matlab里,这很简单,用imread
函数就行。比如,我的图像叫,那就直接img = imread('*');
,搞定!现在img
就是一个包含图像数据的矩阵。
接下来就是重头戏,怎么用gamma函数进行校正?我找到imadjust
这个函数,据说它可以调整图像的灰度。但是直接用imadjust
好像没法直接指定gamma值,还得自己算一下。后来我发现,可以直接对图像矩阵里的每个像素值进行幂运算,这不就是gamma校正的原理嘛
比如,我想让图像变亮一点,那就设置gamma值小于1,比如0.5。代码大概是这样:
img = imread('*');
gamma = 0.5;

img_adjusted = im2double(img).^gamma;
imshow(img_adjusted);
这里im2double
是把图像数据转换到0到1之间,方便进行幂运算。imshow
就是显示图像。跑一下,图像果然亮一些,但是感觉有点过曝。
我又试gamma值大于1的情况,比如2。这回图像变暗,细节更明显。感觉找到点感觉。
后来我又发现,Matlab里有个gamma
函数,但是这个函数不是直接用来校正图像的,而是用来计算伽马函数值的。伽马函数本身是个数学函数,跟图像处理没啥直接关系。不过我猜想,imadjust
之类的函数内部可能也会用到伽马函数的一些特性,毕竟它跟亮度、对比度这些东西有关联。
为更精确地控制gamma校正,我还尝试自己写函数来实现。基本思路就是遍历图像矩阵的每个像素,然后根据gamma值进行调整。代码大概是这样:
function adjusted_img = my_gamma_correction(img, gamma)
img = im2double(img);

adjusted_img = img.^gamma;
end
然后调用这个函数:
img = imread('*');
gamma = 0.7;
adjusted_img = my_gamma_correction(img, gamma);
imshow(adjusted_img);
效果跟直接用幂运算差不多,但是自己写的好处是可以更灵活地控制参数,比如可以对不同的区域使用不同的gamma值。
我还尝试用histeq
函数进行直方图均衡化,这个函数也能改善图像的对比度,但它的原理跟gamma校正不太一样,它是通过重新分布像素值的频率来实现的。有时候,直方图均衡化的效果比gamma校正更但有时候又不如gamma校正,具体用哪个还得看实际情况。
这回实践让我对gamma函数有更深的理解,也学会在Matlab里进行图像处理的一些基本技巧。虽然只是个小小的尝试,但感觉收获满满!