1 解决思路
1.1 问题背景
对于有一些如光照等原因造成的图片过于明亮等情况,尝试用图像处理的方法对其“稍作修改~”
1.2 解决思路
- 考虑对于图片亮度越大的地方,调整的“力度”越大;
- 采用“渐变”的方式改变调整的“力度”;
- 渐变的形式对比选择;
2 采用“渐变”的方式改变调整的“力度”
2.1 线性调整
根据亮度高的地方调整的力度要大,可以考虑线性函数调整,随着亮度值(相当于灰度值)增加,对其进行亮度减小的作用均匀增加。
2.2 非线性调整
对比前面的线性函数,可以发现非线性函数可以对灰度值高(亮)的区域大力调整,而对灰度值低(暗)的区域几乎不做调整。
3 实验与分析
3.1 实现
该方法选择HSV模型来调整图像明暗程度,首先将RGB图像转化成HSV模型,再通过建立好的调整函数对V进行调整。调整函数如下:
线性 | y = 0.00392*x |
---|---|
非线性 | y1 = (x/255).^2 |
非线性 | y2 = (x/255).^6 |
当然了,处理的时候前面加上“-”,后面会给出程序。
对于下面的3张图,请注意看天空和云朵的部分(亮的部分)和路面(明暗中间区域),暗的地方看着不明显……
从图中可以看出,线性调整和非线性调整都降低了图像的亮度,但是非线性调整总体给人感觉更平滑。此外,在天空部分,非线性处理保留了相当的对比度,而线性调整虽然也起到了降低亮度的作用,但是对比度也同步降低了的样子;路面处,非线性调整很明显保留了原图像特征,而线性调整则也对其进行了亮度调整,虽然对相对高亮度区域其调整力度有所减少,但是依然能够感觉到降低了图像对比度(效果得看情况@-@)。
再来看一下这几幅图的直方图:
注意看横坐标的范围,非线性调整相对线性调整,保留了更多的灰度级,看到原图的直方图,应该照片照的不好,不过对于亮处的处理确实效果可以。大家可以自己试一试其他的图片。
再看直方图的形状,形态几乎没有改变,只是压缩了一点。
3.2 matlab代码
clc
close
clear
I = imread("C:\Users\含笑韭泉\Desktop\光照1.jpg");
I_gray = rgb2gray(I);
I_hsv = rgb2hsv(I);
I_new1 = I_hsv;
I_new2 = I_hsv;
for i = 1:size(I_gray,1)
for j = 1:size(I_gray,2)
%以下是对hsv中的v(明度)进行调整
I_new1(i,j,3) = I_hsv(i,j,3) * (1-0.25*(0.00392*double(I_gray(i,j)))); %线性
I_new2(i,j,3) = I_hsv(i,j,3) * (1-0.25*(double(I_gray(i,j))/255)^6); %非线性
end
end
I_end1 = hsv2rgb(I_new1);
I_end2 = hsv2rgb(I_new2);
figure
subplot(1,3,1);
imshow(I);
xlabel("原图");
subplot(1,3,2)
imshow(I_end1);
xlabel("线性调整,亮度最大下降25%");
subplot(1,3,3)
imshow(I_end2);
xlabel("非线性调整,亮度最大下降25%");
figure
subplot(1,3,1);
imhist(hsv2rgb(I_hsv),64); %保持横坐标相同
title("原图直方图");
subplot(1,3,2);
imhist(I_end1,64);
title("线性调整");
subplot(1,3,3);
imhist(I_end2,64);
title("非线性调整");
欢迎各位小伙伴来一起学习图像处理,期待与大家共同进步!