日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分段线性变换与直方图修正

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分段线性变换与直方图修正 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要包括以下內容

  • 分段線性變換
  • 兩種實用的直方圖修正技術:直方圖均衡化和直方圖規定化
  • 本章的典型案例分析
    • 基于直方圖均衡化的圖像灰度歸一化
    • 直方圖匹配

分段線性變換

分段線性變換有很多種, 包括灰度拉伸、 灰度窗口變換等, 本節僅講述最為常用的灰度拉伸.

利用分段線性變換函數來增強圖像對比度的方法實際是增強原圖各部分的反差,即增強輸入圖像中感興趣的灰度區域,相對抑制那些不感興趣的灰度區域。分段線性函數的主要優勢在于它的形式可任意合成,而其缺點是需要更多的用戶輸入.

分段的灰度拉伸可以更加靈活地控制輸出灰度直方圖的分布,可以有選擇的拉伸某段灰
度區間以改善輸出圖像。如果一幅圖像灰度集中在較暗的區域而導致圖像偏暗,我們可以用
灰度拉伸功能來擴展(斜率>1)物體灰度區間以改善圖像:同樣,如果圖像灰度集中在較亮
的區域而導致圖像偏亮,也可以用灰度拉伸功能來壓縮〈斜率<1)物體灰度區間以改善圖像
質量。

灰度拉伸是通過控制輸出圖像中灰度級的展開程度來達到控制對比度的效果。一般情況
下都限制x1<x2,y1<y2,從而保證函數單調遞增,以避免造成處理過的圖像中灰度級發生顛倒.

matlab實現

function out = imgrayscaling(varargin) % IMGRAYSCALING 執行灰度拉伸功能 % 語法: % out = imgrayscaling(I, [x1,x2], [y1,y2]); % out = imgrayscaling(X, map, [x1,x2], [y1,y2]); % out = imgrayscaling(RGB, [x1,x2], [y1,y2]); % 這個函數提供灰度拉伸功能,輸入圖像應當是灰度圖像,但如果提供的不是灰度 % 圖像的話,函數會自動將圖像轉化為灰度形式。x1,x2,y1,y2應當使用雙精度 % 類型存儲,圖像矩陣可以使用任何MATLAB支持的類型存儲。[A, map, x1 , x2, y1, y2] = parse_inputs(varargin{:});% 計算輸入圖像A中數據類型對應的取值范圍 range = getrangefromclass(A); range = range(2);% 如果輸入圖像不是灰度圖,則需要執行轉換 if ndims(A)==3,% A矩陣為3維,RGB圖像A = rgb2gray(A); elseif ~isempty(map),% MAP變量為非空,索引圖像A = ind2gray(A,map); end % 對灰度圖像則不需要轉換% 讀取原始圖像的大小并初始化輸出圖像 [M,N] = size(A); I = im2double(A); % 將輸入圖像轉換為雙精度類型 out = zeros(M,N);% 主體部分,雙級嵌套循環和選擇結構 for i=1:Mfor j=1:Nif I(i,j)<x1out(i,j) = y1 * I(i,j) / x1;elseif I(i,j)>x2out(i,j) = (I(i,j)-x2)*(range-y2)/(range-x2) + y2;elseout(i,j) = (I(i,j)-x1)*(y2-y1)/(x2-x1) + y1;endend end% 將輸出圖像的格式轉化為與輸入圖像相同 if isa(A, 'uint8') % uint8out = im2uint8(out); elseif isa(A, 'uint16')out = im2uint16(out); % 其它情況,輸出雙精度類型的圖像 end% 輸出: if nargout==0 % 如果沒有提供參數接受返回值imshow(out);return; end %----------------------------------------------------------------------------- function [A, map, x1, x2, y1, y2] = parse_inputs(varargin); % 這就是用來分析輸入參數個數和有效性的函數parse_inputs % A 輸入圖像,RGB圖 (3D), 灰度圖 (2D), 或者索引圖 (X) % map 索引圖調色板 (:,3) % [x1,x2] 參數組 1,曲線中兩個轉折點的橫坐標 % [y1,y2] 參數組 2,曲線中兩個轉折點的縱坐標 % 首先建立一個空的map變量,以免后面調用isempty(map)時出錯 map = [];% IPTCHECKNARGIN(LOW,HIGH,NUM_INPUTS,FUNC_NAME) 檢查輸入參數的個數是否 % 符合要求,即NUM_INPUTS中包含的輸入變量個數是否在LOW和HIGH所指定的范圍 % 內。如果不在范圍內,則此函數給出一個格式化的錯誤信息。 iptchecknargin(3,4,nargin,mfilename);% IPTCHECKINPUT(A,CLASSES,ATTRIBUTES,FUNC_NAME,VAR_NAME, ARG_POS) 檢查給定 % 矩陣A中的元素是否屬于給定的類型列表。如果存在元素不屬于給定的類型,則給出 % 一個格式化的錯誤信息。 iptcheckinput(varargin{1},...{'uint8','uint16','int16','double'}, ...{'real', 'nonsparse'},mfilename,'I, X or RGB',1);switch nargincase 3 % 可能是imgrayscaling(I, [x1,x2], [y1,y2]) 或 imgrayscaling(RGB, [x1,x2], [y1,y2])A = varargin{1};x1 = varargin{2}(1);x2 = varargin{2}(2);y1 = varargin{3}(1);y2 = varargin{3}(2);case 4A = varargin{1};% imgrayscaling(X, map, [x1,x2], [y1,y2])map = varargin{2};x1 = varargin{2}(1);x2 = varargin{2}(2);y1 = varargin{3}(1);y2 = varargin{3}(2); end% 檢測輸入參數的有效性 % 檢查RGB數組 if (ndims(A)==3) && (size(A,3)~=3) msg = sprintf('%s: 真彩色圖像應當使用一個M-N-3維度的數組', ...upper(mfilename));eid = sprintf('Images:%s:trueColorRgbImageMustBeMbyNby3',mfilename);error(eid,'%s',msg); endif ~isempty(map) % 檢查調色板if (size(map,2) ~= 3) || ndims(map)>2msg1 = sprintf('%s: 輸入的調色板應當是一個矩陣', ...upper(mfilename));msg2 = '并擁有三列';eid = sprintf('Images:%s:inColormapMustBe2Dwith3Cols',mfilename);error(eid,'%s %s',msg1,msg2);elseif (min(map(:))<0) || (max(map(:))>1)msg1 = sprintf('%s: 調色板中各個分量的強度 ',upper(mfilename));msg2 = '應當在0和1之間';eid = sprintf('Images:%s:colormapValsMustBe0to1',mfilename);error(eid,'%s %s',msg1,msg2);end end% 將int16類型的矩陣轉換成uint16類型 if isa(A,'int16')A = int16touint16(A); end

調用

I = imread('coins.png'); J1 = imgrayscaling(I,[0.3,0.75],[0.15,0.85]); figure,imshow(J1,[]); J2 = imgrayscaling(I,[0.15,0.85],[0.3,0.7]); figure,imshow(J2,[]);

從圖中可以看出,第一組參數讓圖像灰度直方圖上的非零區域擴展,而第二
組參數讓圖像的灰度直方圖非零區域壓縮, 這給目標圖像帶來了截然不同的效果。第一幅圖
像中的細節更加清晰, 而第二幅圖像更加柔和。

直方圖均衡化

直方圖均衡化又稱灰度均衡化.是指通過某種灰度映射使輸入圖像轉換為在每一灰度級 上都有近似相同的像素點數的輸出圖像(即輸出的直方圖是均勻的〉。在經過均衡化處理后的圖像中,像素將占有盡可能多的灰度級并且分布均勻.因此,這樣的圖像將具有較高的對比度和較大的動態范圍。

為了便于分析,首先考慮灰度范圍為0~1且連續的情況。此時圖像的歸一化直方圖即為概率密度函數(PDF):

直方圖均衡化的數學原理:直方圖均衡化原理及編碼實現
這個推導很詳細,是我看過最清楚明白的一個。

直方圖均衡化的作用是圖像增強
有兩個問題比較難懂,一是為什么要選用累積分布函數,二是為什么使用累積分布函數處理后像素值會均勻分布。
參見: 直方圖均衡化原理

matlab實現

下面的程序在讀入了圖像pout.tif后,分別對其進行了增加對比度,減小對比度,線性增 加亮度和線性減小亮度的處理, 得到了原圖像的4個灰度變化版本;接著又分別對這4副圖 像進行了立方圖均衡化處理并顯示了它們在處理前、 后的直方圖.

I = imread('pout.tif'); I = im2double(I);I1 = 2*I - 55/255; subplot(4,4,1); imshow(I1); subplot(4,4,2); imhist(I1); subplot(4,4,3); imshow(histeq(I1)); subplot(4,4,4); imhist(histeq(I1));I2 = 0.5*I + 55/255; subplot(4,4,5); imshow(I2); subplot(4,4,6); imhist(I2); subplot(4,4,7); imshow(histeq(I2)); subplot(4,4,8); imhist(histeq(I2));I3 = I + 55/255; subplot(4,4,9); imshow(I3); subplot(4,4,10); imhist(I3); subplot(4,4,11); imshow(histeq(I3)); subplot(4,4,12); imhist(histeq(I3));I4 = I - 55/255; subplot(4,4,13); imshow(I4); subplot(4,4,14); imhist(I4); subplot(4,4,15); imshow(histeq(I4)); subplot(4,4,16); imhist(histeq(I4));

直方圖規定化

直方圖均衡化算法可以自動確定灰度變換函數, 從而獲得具有均勻直方圖的輸出圖像。它主要用于增強動態范圍偏小的圖像對比度, 豐富圖像的灰度級。 這種方法的優點是操作簡單, 且結果可以預知, 當圖像需要自動增強時是一種不錯的選擇。

但有時用戶也希望可以對變換過程加以控制, 如能夠人為地修正直方圖的形狀, 或者說獲得具有指定直方圖的輸出圖像..這樣就可以有選擇地增強某個灰度范圍內的對比度或使圖
像灰度值滿足某種特定的分布 這種用于產生具有特定直方圖圖像的方法叫做直方圖規定化,或直方圖匹配.

直方圖規定化是在運用均衡化原理的基礎上,通過建立原始圖像和期望圖像〈待匹配直方圖的圖像〉之間的關系,使原始圖像的直方圖匹配特定的形狀,從而彌補直方圖均衡不具備交互作用的特性。

直方圖規定化增強處理的步驟如下:
1,其增強原理是先對原始的直方圖均衡化:S = T(r)
2,同時對規定的直方圖均衡化:v = G(z)
3,由于都是均衡化,故令 S = v,則:z=G?1(v)=G?1[T(r)]

當然,在實際計算中我們利用的是上述公式的離散形式,這樣就不必去關心函數只f(r),g(z)
以及反變換函數g的具體解析形式, 而可以直接將它們作為映射表處理。其中, f(r)為輸入
圖像均衡化的離散灰度級映射關系, g(z)為標準圖像均衡化的離散灰度級映射關系, 而g
則是標準圖像均衡化的逆映射關系, 它給出了從經過均衡化處理的標準化圖像到原標準圖像
的離散灰度映射, 相當于均衡化處理的逆過程。

matlab實現
histeq函數不僅可以用于直方圖均衡化, 也可以用于直方圖規定化, 此時需要提供可選
參數hgram. 調用語法為:
[J, T]=histeq(I, hgram)

函數會將原始圖像I處理成一幅以用戶指定向量hgram作為直方圖的圖像。
參數hgram的分量數目即為直方圖的收集箱數目。對于double型圖像,hgram的元素取
值范圍是[O, 1):對于uint8型圖像為[O, 255):對于uint16型圖像則為(0, 65535)。
其他參數的意義與在直方圈均衡化中的相同。

I = imread('pout.tif'); I1 = imread('coins.png'); I2 = imread('circuit.tif'); [hgram1,x]=imhist(I1); [hgram2,x]=imhist(I2);J1 = histeq(I,hgram1); J2 = histeq(I,hgram2);subplot(2,3,1); imshow(I);title('原圖'); subplot(2,3,2); imshow(I1);title('標準圖1'); subplot(2,3,3); imshow(I2);title('標準圖2'); subplot(2,3,5); imshow(J1);title('規定化到1'); subplot(2,3,6); imshow(J2);title('規定化到2');figure;subplot(2,3,1); imhist(I);title('原圖'); subplot(2,3,2); imhist(I1);title('標準圖1'); subplot(2,3,3); imhist(I2);title('標準圖2'); subplot(2,3,5); imhist(J1);title('規定化到1'); subplot(2,3,6); imhist(J2);title('規定化到2');

直方圖規定化本質上是一種擬合過程, 因此變換得到的直方圖與標準目標圖像的直方圖 并不會完全一致。 然而即使只是相似的擬合, 仍然使規定化的圖像在亮度與對比度上具有類 似標準圖像的特性, 這正是直方圖規定化的目的所在.

總結

以上是生活随笔為你收集整理的分段线性变换与直方图修正的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。