图像插值处理
圖像插值處理
問題描述:讀取圖像,然后對圖像進行最近鄰插值、雙線性插值、雙三次插值處理。
本文主要側重于代碼的實現,相關的原理性介紹可參考
最鄰近插值
最近鄰插值 法的優點是計算量很小,算法也簡單,因此運算速度較快。但它僅使用離待測采樣點最近的像素的灰度值作為該采樣點的灰度值,而沒考慮其他相鄰像素點的影響,因而重新采樣后灰度值有明顯的不連續性,圖像質量損失較大,會產生明顯的馬賽克和鋸齒現象。
可采用下述公示進行圖像的最鄰近插值,其中I′I'I′為放大后圖像,III為放大前圖像,aaa為放大率,方括號是四舍五入取整操作:
I′(x,y)=I([xa],[ya])I'(x,y) = I([\frac{x}{a}], [\frac{y}{a}]) I′(x,y)=I([ax?],[ay?])
// 最近鄰插值 cv::Mat nearest_neighbor(cv::Mat img, double rx, double ry) {int row = img.rows;int col = img.cols;int channel = img.channels();// Resize width and heightint resized_col = (int)(col * rx);int resized_row = (int)(row * ry);cv::Mat new_image = cv::Mat::zeros(resized_row, resized_col, CV_8UC3);int pos_before_x, pos_before_y;// nearest_neighborfor (int i = 0; i < resized_row; i++){pos_before_y = (int)round(i / ry);pos_before_y = fmin(pos_before_y, row - 1);for (int j = 0; j < resized_col; j++){pos_before_x = (int)round(j / rx);pos_before_x = fmin(pos_before_x, col - 1);for (int chan = 0; chan < channel; chan++){new_image.at<cv::Vec3b>(i, j)[chan] = img.at<cv::Vec3b>(pos_before_y, pos_before_x)[chan];}}}return new_image; }雙線性插值
雙線性插值考察444鄰域的像素點,并根據距離設置權值。雖然計算量增大使得處理時間變長,但是可以有效抑制畫質劣化。
放大后圖像的座標(x′,y′)(x',y')(x′,y′)除以放大率aaa,可以得到對應原圖像的座標(?x′a?,?y′a?)(\lfloor \frac{x'}{a}\rfloor , \lfloor \frac{y'}{a}\rfloor)(?ax′??,?ay′??)。
求原圖像的座標(?x′a?,?y′a?)(\lfloor \frac{x'}{a}\rfloor , \lfloor \frac{y'}{a}\rfloor)(?ax′??,?ay′??)周圍444鄰域的座標I(x,y)I(x,y)I(x,y),I(x+1,y)I(x+1,y)I(x+1,y),I(x,y+1)I(x,y+1)I(x,y+1),I(x+1,y+1)I(x+1, y+1)I(x+1,y+1):
分別求這4個點與(x′a,y′a)(\frac{x'}{a}, \frac{y'}{a})(ax′?,ay′?)的距離,根據距離設置權重:w=d∑dw = \fracozvdkddzhkzd{\sum\ d}w=∑?dd?
根據下式求得放大后圖像(x′,y′)(x',y')(x′,y′)處的像素值:
dx=x′a?xdy=y′a?yI′(x′,y′)=(1?dx)(1?dy)I(x,y)+dx(1?dy)I(x+1,y)+(1?dx)dyI(x,y+1)+dxdyI(x+1,y+1)d_x = \frac{x'}{a} - x\\ d_y = \frac{y'}{a} - y\\ I'(x',y') = (1-d_x)\ (1-d_y)\ I(x,y) + d_x\ (1-d_y)\ I(x+1,y) + (1-d_x)\ d_y\ I(x,y+1) + d_x\ d_y\ I(x+1,y+1) dx?=ax′??xdy?=ay′??yI′(x′,y′)=(1?dx?)?(1?dy?)?I(x,y)+dx??(1?dy?)?I(x+1,y)+(1?dx?)?dy??I(x,y+1)+dx??dy??I(x+1,y+1)
雙三次插值
雙三次插值是雙線性插值的擴展,使用鄰域161616像素進行插值。
各自像素間的距離由下式決定:
dx1=∣x′ax?(x?1)∣dx2=∣x′ax?x∣dx3=∣x′ax?(x+1)∣dx4=∣x′ax?(x+2)∣dy1=∣x′ay?(y?1)∣dy2=∣x′ay?y∣dy3=∣x′ay?(y+1)∣dy4=∣x′ay?(y+2)∣d_{x_1} = |\frac{x'}{a\ x} - (x-1)|\quad d_{x_2} = |\frac{x'}{a\ x}- x| \quad d_{x_3} = |\frac{x'}{a\ x}- (x+1)|\quad d_{x_4} = |\frac{x'}{a\ x} - (x+2)|\\ d_{y_1} = |\frac{x'}{a\ y} - (y-1)|\quad d_{y_2} = |\frac{x'}{a\ y} - y| \quad d_{y_3} = |\frac{x'}{a\ y} - (y+1)| \quad d_{y_4} = |\frac{x'}{a\ y} - (y+2)| dx1??=∣a?xx′??(x?1)∣dx2??=∣a?xx′??x∣dx3??=∣a?xx′??(x+1)∣dx4??=∣a?xx′??(x+2)∣dy1??=∣a?yx′??(y?1)∣dy2??=∣a?yx′??y∣dy3??=∣a?yx′??(y+1)∣dy4??=∣a?yx′??(y+2)∣
權重由基于距離的函數取得。aaa在大部分時候取?1-1?1。權重公示如下:
h(t)={(a+2)∣t∣3?(a+3)∣t∣2+1when∣t∣≤1a∣t∣3?5a∣t∣2+8a∣t∣?4awhen1<∣t∣≤20elseh(t)= \begin{cases} (a+2)\ |t|^3 - (a+3)\ |t|^2 + 1 &\text{when}\quad |t|\leq 1 \\ a\ |t|^3 - 5\ a\ |t|^2 + 8\ a\ |t| - 4\ a&\text{when}\quad 1<|t|\leq 2\\ 0&\text{else} \end{cases} h(t)=??????(a+2)?∣t∣3?(a+3)?∣t∣2+1a?∣t∣3?5?a?∣t∣2+8?a?∣t∣?4?a0?when∣t∣≤1when1<∣t∣≤2else?
利用上面得到的權重,通過下面的式子擴大圖像。將每個像素與權重的乘積之和除以權重的和。
I′(x′,y′)=1∑j=14∑i=14h(dxi)h(dyj)∑j=14∑i=14I(x+i?2,y+j?2)h(dxi)h(dyj)I'(x', y')=\frac{1}{\sum\limits_{j=1}^4\ \sum\limits_{i=1}^4\ h(d_{xi})\ h(d_{yj})}\ \sum\limits_{j=1}^4\ \sum\limits_{i=1}^4\ I(x+i-2,y+j-2)\ h(d_{xi})\ h(d_{yj}) I′(x′,y′)=j=1∑4??i=1∑4??h(dxi?)?h(dyj?)1??j=1∑4??i=1∑4??I(x+i?2,y+j?2)?h(dxi?)?h(dyj?)
總結
- 上一篇: 针对MNE画脑电地形图出现ValueEr
- 下一篇: 数字取证wireshark流量分析