Matlab——图像缩放(插值法)
實驗內容:
????用雙線性內插法實現位深度為8的灰度圖像的縮放。
?
思路:
?????輸入原圖像以及縮放后圖像的像素要求(寬度*高度),處理后輸出新圖像。
????我是用matlab來實現scale(input_img,scale_size)函數的,輸入圖像路徑以及要求實現的寬度scale_w和高度值scale_h即可。通過matlab把原圖像轉化為img矩陣,這樣矩陣img(a, b)元素的值就是原圖像高度為a,寬度為b處的像素值。
???設處理前后圖像的寬度和高度分別為w、h,scale_w、scale_h。
??? 如上圖所示,row對應的是高度,設為x軸;col對應的是寬度,設為y軸;value對應的是灰度值,設為z軸。
?
??? 通過縮放比例,可以求得新圖像B在(i,j)處對應原圖像的點為(x,y)(其中x= i*h/scale_h,y= j*w/scale_w)。
但是這兩個值可能為浮點數,而像素中的位置是整數,所以這個點在原圖像中對應的可能是“虛”點。所以,我們需
要根據找該“虛”點周圍的四個點來進行雙線性插值得到新圖像的灰度值。我們應該取的是(x,y)鄰近的四個像素
(x0,y0) 、(x0,y1) 、(x1,y0) 、(x1,y1),它們對應的灰度值為f(x0,y0) 、f(x0,y1)、 f(x1,y0)、 f(x1,y1)。
??
??? 先對x方向進行插值,再對y方向進行插值,計算如下:
????
????
????
?
??? 反過來,先對y方向:
????
????
????
?
??? 顯然,鄰近像素的x1-x0 = y1-y0 = 1
??? 整理式子得到:
?
??? 這里u、v分別是x、y的小數部分,即u = x - x0; v = y - y0
?????? 要注意的是:上述公式img(a,b)中的a和b不能小于1,所以當x和y小于1時需要將其重新賦值為1。
?
代碼:
function output_img = scale(input_img, scale_size) %Input - input_img is a two-dimensional matrices storing image % - scale_size is a tuple of [width, height] defining the spatial resolution of output %Output - output_img is the same as input_imgimg = imread(input_img); %讀取輸入圖片的數據 [h,w] = size(img); %獲取行和列,即原圖的高度和寬度scale_w = scale_size(1); %根據輸入獲得縮放后的新寬度 scale_h = scale_size(2); %根據輸入獲得縮放后的新高度 output_img = zeros(scale_h, scale_w); %初始化for i = 1 : scale_h %縮放后的圖像的(i,j)位置對應原圖的(x,y)for j = 1 : scale_wx = i * h / scale_h;y = j * w / scale_w;u = x - floor(x);v = y - floor(y); %取小數部分if x < 1 %邊界處理x = 1;endif y < 1y = 1;end%用原圖的四個真實像素點來雙線性插值獲得“虛”像素的像素值output_img(i, j) = img(floor(x), floor(y)) * (1-u) * (1-v) + ...img(floor(x), ceil(y)) * (1-u) * v + ...img(ceil(x), floor(y)) * u * (1-v) + ...img(ceil(x), ceil(y)) * u * v;end endimwrite(uint8(output_img), '../output_img.png'); %保存處理后的圖像 imshow(input_img); %顯示原圖 figure,imshow(uint8(output_img)) %顯示處理后的圖像運行時若圖片在代碼上一級目錄,則輸入scale('../a.png', [450,300]);
?
效果圖:
原圖為384*256:
縮小成192*128:??
放大成450*300:
縮放成500*200:
?
//
?轉載:https://blog.csdn.net/Stella_Chan/article/details/78025020?locationNum=5&fps=1
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Matlab——图像缩放(插值法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++常见的转义符
- 下一篇: opencv画图_c++