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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图像插值处理

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像插值处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖像插值處理


問題描述:讀取圖像,然后對圖像進行最近鄰插值、雙線性插值、雙三次插值處理。

本文主要側重于代碼的實現,相關的原理性介紹可參考

最鄰近插值

最近鄰插值 法的優點是計算量很小,算法也簡單,因此運算速度較快。但它僅使用離待測采樣點最近的像素的灰度值作為該采樣點的灰度值,而沒考慮其他相鄰像素點的影響,因而重新采樣后灰度值有明顯的不連續性,圖像質量損失較大,會產生明顯的馬賽克和鋸齒現象。

可采用下述公示進行圖像的最鄰近插值,其中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; } 輸入圖像 (fate.jpeg)輸出圖像 (fate_nearest_neighbor.jpeg)

雙線性插值

雙線性插值考察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)

  • // 雙線性插值 cv::Mat bilinear(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_j, pos_before_i;double dx, dy;double val;// bilinearfor (int i = 0; i < resized_row; i++){pos_before_i = (int)round(i / ry);pos_before_i = fmin(pos_before_i, row - 1);dy = round(i / ry) - pos_before_i;for (int j = 0; j < resized_col; j++){pos_before_j = (int)round(j / rx);pos_before_j = fmin(pos_before_j, col - 1);dx = round(j / rx) - pos_before_j;for (int chan = 0; chan < channel; chan++){val = (1 - dx) * (1 - dy) * img.at<cv::Vec3b>(pos_before_i, pos_before_j)[chan] +dx * (1 - dy) * img.at<cv::Vec3b>(pos_before_i, pos_before_j + 1)[chan] +(1 - dx) * dy * img.at<cv::Vec3b>(pos_before_i + 1, pos_before_j)[chan] +dx * dy * img.at<cv::Vec3b>(pos_before_i + 1, pos_before_j + 1)[chan];new_image.at<cv::Vec3b>(i, j)[chan] = (uchar)val;}}}return new_image; } 輸入圖像 (fate.jpeg)輸出圖像 (fate_nearest_neighbor.jpeg)

    雙三次插值

    雙三次插值是雙線性插值的擴展,使用鄰域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??xdx3??=a?xx??(x+1)dx4??=a?xx??(x+2)dy1??=a?yx??(y?1)dy2??=a?yx??ydy3??=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)?t3?(a+3)?t2+1a?t3?5?a?t2+8?a?t?4?a0?whent1when1<t2else?
    利用上面得到的權重,通過下面的式子擴大圖像。將每個像素與權重的乘積之和除以權重的和。
    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=14??i=14??h(dxi?)?h(dyj?)1??j=14??i=14??I(x+i?2,y+j?2)?h(dxi?)?h(dyj?)

    // weight function double weight(double t) {double a = -1;if (fabs(t) <= 1){return (a + 2) * pow(fabs(t), 3) - (a + 3) * pow(fabs(t), 2) + 1;} else if (fabs(t) <= 2){return a * pow(fabs(t), 3) - 5 * a * pow(fabs(t), 2) + 8 * a * fabs(t) - 4 * a;}return 0; }cv::Mat bicubic(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);int pos_before_j, pos_before_i;int pos_j, pos_i;double dx, dy, weight_j, weight_i, weight_sum;double val;cv::Mat new_image = cv::Mat::zeros(resized_row, resized_col, CV_8UC3);// bicubicfor (int i = 0; i < resized_row; i++){dy = i / ry;pos_before_i = (int)floor(dy);for (int j = 0; j < resized_col; j++){dx = j / rx;pos_before_j = (int)floor(dx);for (int chan = 0; chan < channel; chan++){weight_sum = 0;val = 0;for (int di = -1; di < 3; di++){pos_i = fmin(fmax(pos_before_i + di, 0), row - 1);weight_i = weight(fabs(dy - pos_i));for (int dj = -1; dj < 3; dj++){pos_j = fmin(fmax(pos_before_j + dj, 0), col - 1);weight_j = weight(fabs(dx - pos_j));weight_sum += weight_i * weight_j;val += (double)img.at<cv::Vec3b>(pos_i, pos_j)[chan] * weight_i * weight_j;}}val /= weight_sum;val = fmin(fmax(val, 0), 255);new_image.at<cv::Vec3b>(i, j)[chan] = (uchar)val;}}}return new_image; }int main(){// read imagecv::Mat img = cv::imread("../fate.jpeg", cv::IMREAD_COLOR);// cv::Mat new_image = nearest_neighbor(img, 1.5, 1.5); // 最近臨插值 // cv::Mat new_image = bilinear(img, 1.3, 1.3); // 雙線性插值cv::Mat new_image = bicubic(img, 1.4, 1.4); // 雙三次插值// cv::imwrite("../1-10/fate_nearest_neighbor.jpeg", new_image); // cv::imwrite("../1-10/fate_bilinear.jpeg", new_image);cv::imwrite("../1-10/fate_bicubic.jpeg", new_image);cv::imshow("vv", new_image);cv::waitKey(0);cv::destroyAllWindows();return 0; } 輸入圖像 (fate.jpeg)輸出圖像 (fate_bicubic.jpeg)

    總結

    以上是生活随笔為你收集整理的图像插值处理的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲AV午夜成人片 | 大肉大捧一进一出视频 | 欧美日韩四区 | 国产成人一区二区三区影院在线 | 国产又粗又长又大视频 | 看黄色网址 | 99久久婷婷国产综合精品草原 | 欧美人和黑人牲交网站上线 | 图片一区二区 | 亚洲日本香蕉视频 | 欧美在线国产 | 亚洲精品一区二区三区在线 | 浪荡奴双性跪着伺候 | 日韩欧美中文 | 污视频免费在线观看网站 | 亚洲精品午夜精品 | 午夜在线观看免费视频 | 黄色a一级视频 | 国产成人无码精品久久 | 久热国产精品视频 | 婷婷777 | 性――交――性――乱睡觉 | 小俊大肉大捧一进一出好爽 | 日韩高清片 | 师生出轨h灌满了1v1 | 国产对白在线 | 亚洲一区二区三区四区av | 综合视频一区 | 一级黄色录像大片 | 成人h动漫精品一区二区无码 | 久久天天东北熟女毛茸茸 | 国产精品sm调教免费专区 | 精品成人av一区二区三区 | 免费在线观看不卡av | 无码人妻精品中文字幕 | 欧美成人久久久免费播放 | 欧美中文在线观看 | 中文字幕av在线免费观看 | 无码精品黑人一区二区三区 | 色伊人av| 国产a国产片国产 | 麻豆传媒网址 | 麻豆中文字幕 | 风流少妇一区二区三区91 | 理论片大全免费理伦片 | 写真福利片hd在线播放 | 久久精品在线视频 | 久久久久久成人精品 | 久久综合精品国产二区无码不卡 | 中文字幕一区二区三区人妻不卡 | 久久av资源 | 九九热最新网址 | 疯狂揉花蒂控制高潮h | 青青青网 | 久久免费手机视频 | 精品一级少妇久久久久久久 | 老头老太做爰xxx视频 | 超碰免费看 | 农村村妇真实偷人视频 | 四川话毛片少妇免费看 | 色 综合 欧美 亚洲 国产 | 18禁超污无遮挡无码免费游戏 | 男女视频一区二区 | 免费www xxx| 国产女人18毛片 | 亚洲va天堂va国产va久 | 欧美精品一区二区三区久久久 | 91久久| 91精品国产高清一区二区三蜜臀 | av手机天堂 | 亲切的金子餐桌片段的金子 | 亚洲综合五区 | 欧美日韩少妇精品 | 又黄又骚又爽 | 一级a毛片免费观看久久精品 | 一区二区三区在线观看 | 四虎网站在线播放 | 99精品人妻少妇一区二区 | 911国产在线 | 成人福利免费视频 | 久操伊人网 | 国产最新视频在线 | 亚洲精品电影院 | 精国产人伦一区二区三区 | 男女超爽视频免费播放 | 超碰在线98 | 成人综合网址 | 悠悠色影院 | 天天爱天天舔 | 精品偷拍一区 | 1024国产精品| 久久国产a| 欧美做受视频 | 日屁视频 | 国产成人在线观看免费 | 日韩精品综合 | 香蕉视频黄在线观看 | 黑人番号| 精品无码国产一区二区三区av |