ISP-EE(Edge Enhance)
EE模塊在某些ISP主控中叫做sharpness或者sharpen,這些名稱指代的模塊是同一個,不用再糾結。主要就是在YUV域內彌補成像過程中圖像的銳度損失,對邊緣和細節進行加強,從而恢復場景本應具有的自然銳度。
銳度下降的原因
如上圖所示,理想的邊緣如左側所示,是個高反差,對比強的邊。而實際成像的效果是右側的狀況,反差變弱,且邊緣過渡緩慢,給人的視覺沖擊不夠,也就看上去沒有左側清晰銳利。造成邊緣這種衰減的主要原因一方面是鏡頭的物理性質的限制,具體的原因不做深入討論,屬于光學范疇,簡單理解就是鏡頭本身就是低通屬性,所以圖像成像光信號經過鏡頭后相當于進行了一次低通濾波,會導致邊緣衰減。另一方面就是Pipeline中例如去買賽克,NR等算法都是低通特性的,都會導致高頻損失從而表現出銳度下降。
銳化的原理
由于圖像中的細節和邊緣在頻域中主要體現為尖銳程度較高的高頻段上,因此銳化基本思想就是增強圖像分離后產生的高頻分量在像素值中的比重。
上圖摘自知乎博文《Understanding ISP Pipeline - Sharpen - 知乎 (zhihu.com)》。
我們在實際算法中的的做法就是將邊緣反差過渡區域調整得更陡峭更突變,從而到達高反差,高對比實現銳利度的提升。如上圖右下角圖,白色為未處理的變化曲線,紅色為處理后的效果,處理后過渡明顯更快,反差更大,左上經過處理到右上后人眼視覺感覺也確實對比更強,更清晰。
算法又需要如何實際實現呢,其實這個和我們學習美術的時候一樣,我們會描邊,用2B把邊緣描繪一遍,那么邊緣在政府圖像中就會更清楚,其實算法也是這種思路,就是通過邊緣算法提取圖像邊緣,然后將邊緣“描繪”到原始圖像上,那么邊緣也就更加請處理。
上述的描邊過程其實可以簡化為以下的流程:
從上圖中可以看出疊加后的圖像確實清晰度有提升,但是感覺效果并不太好,主要因為鳥的主體部分加強了,但是后面的背景本來平坦的區域經過加強后也出現了很多顆粒感,看上去很難受。所以針對這些問題我們需要優化算法,其實從這個框架看,我們唯一能做的其實就是一個優化邊緣提取的filter,另外一個就是優化λ,所以實際用的時候往往采取一下框圖:
經過filter提取的邊緣經過一個邊緣判決器,然后λ根據這個判決器的判決動態調整加強力度。關于這個判決器和λ的自適應調整內容有點繞,不做過多贅述,有興趣的朋友可以參考B站本算法講解。
代碼演示
clc, clear, close all;preDelta = 2; % 預濾波強度,值越大,邊緣越強
th = 5; % 邊緣檢測閾值
gain = 0.8; % 邊緣增強力度控制img = imread('./images/blurring.png');
figure();
imshow(img);
title('org');[h, w, c] = size(img);
img_yuv = rgb2ycbcr(img);
y = img_yuv(:, :, 1);Iblur = imgaussfilt(y, preDelta);
HighFC = y - Iblur;for i = 1: hfor j = 1: wif HighFC(i, j) > thHighFC(i, j) = HighFC(i, j) * gain;elseHighFC(i, j) = 0;endend
end
figure();
imshow(HighFC);
imwrite(HighFC, './images/edgeDemo.png');
title('edge');y = y + HighFC;
img_yuv(:, :, 1) = y;
res = ycbcr2rgb(img_yuv);
imwrite(res, './images/ee.png');
figure();
imshow(res);
title('res');