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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

opencv:图像的基本变换

發(fā)布時間:2023/12/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv:图像的基本变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0.概述

圖像變換的基本原理都是找到原圖和目標圖的像素位置的映射關系,這個可以用坐標系來思考,在opencv中,
圖像的坐標系是從左上角開始(0,0),向右是x增加方向(cols),向下時y增加方向(rows)。

普通坐標關系:

圖像坐標關系:

1.圖像的平移

圖像的平移是比較簡單的映射關系,對于原圖像的某個像素點位置(X0,Y0),向右平移100個像素的話,變換之后的目標像素點位置(X = X0+100,Y),然后用原圖像的像素值填充目標位置就可,因此我們需要將這種映射關系轉換一下,方便獲得原圖像素值,也就是X0 = X-100,這里X是已知的。

具體代碼如下:

void translation(cv::Mat & src, cv::Mat & dst, int dx, int dy) {const int rows = src.rows; // 獲得原圖的高度(y)const int cols = src.cols; // 獲得原圖的寬度(x)dst.create(rows, cols, src.type()); // 按照原圖大小和格式創(chuàng)建一個空白圖Vec3b *p; for (int Y = 0; Y < rows; ++Y) // 按行掃描{p = dst.ptr<Vec3b>(Y);for (int X = 0; X < cols; ++X){int X0 = X - dx; // 逆映射關系,求得原圖的位置int Y0 = Y - dy;if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows) // 防止越界{p[X] = src.ptr<Vec3b>(Y0)[X0]; // 將原圖的像素值賦給目標位置}}}}

2.圖像的縮放

這里暫時只貼出opencv的縮放接口:

void resize(InputArray src, //輸入圖像 OutputArray dst, // 輸出圖像 Size dsize, // 指定的輸出圖像的大小 double fx=0, // 橫向縮放比例 double fy=0, // 縱向縮放比例 int interpolation=INTER_LINEAR // 指定插值方式);

3.圖像的旋轉

圖像旋轉矩陣的原理可以參考這里

基本映射關系:

我們只需要根據(jù)這個映射關系寫就好,其中的dx和dy主要用來計算旋轉中心的,如果都是0的話圖像就是圍繞
圖像坐標(0,0)來旋轉,該公式中的W'和H'指的是目標圖像的寬度和高度。

代碼:

void rotation(cv::Mat & src, cv::Mat & dst, int angle, cv::Point center = cv::Point(0, 0)) {// 計算角度的正余弦float sint = sin(angle*3.141592653 / 180); float cost = cos(angle*3.141592653 / 180);const int rows = src.rows; // rows == H (Y--->)const int cols = src.cols; // cols == W (X--->)// 計算旋轉中心的偏移float centerxScale = (float)center.x / cols; float centeryScale = (float)center.y / rows;float dx = -centerxScale * cols*cost - centeryScale * rows*sint + centerxScale * cols; // 根據(jù)映射公式float dy = centerxScale * cols*sint - centeryScale * rows*cost + centeryScale * rows;dst.create(rows, cols, src.type());Vec3b *p;for (int Y = 0; Y < rows; ++Y){p = dst.ptr<Vec3b>(Y);for (int X = 0; X < cols; ++X){int X0 = X*cost + Y*sint + dx; // 根據(jù)映射公式int Y0 = -X*sint + Y*cost + dy;if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows){p[X] = src.ptr<Vec3b>(Y0)[X0];}}}}

4.圖像的翻轉

這里也只貼opencv的接口:

void flip(InputArray src, // 原圖像OutputArray dst, //目標圖像 int flipCode // 翻轉方式,1:水平,0:垂直,-1:水平垂直 );

5.圖像的錯切

圖像的錯切效果可以想象伸縮門中的菱形的變化:

不過對于x方向的錯切,y方向的高度并不會變化。

貼代碼:

void shear(cv::Mat & src, cv::Mat & dst, float dx = 0,float dy = 0) // dx,dy為錯切率 {const int rows = src.rows; // rows == H (Y--->)const int cols = src.cols; // cols == W (X--->)dst.create(rows, cols, src.type());Vec3b *p;for (int Y = 0; Y < rows; ++Y){p = dst.ptr<Vec3b>(Y);for (int X = 0; X < cols; ++X){int X0 = X + dx*Y;int Y0 = Y + dy*X;if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows){ p[X] = src.ptr<Vec3b>(Y0)[X0];}}}}

效果圖(dx = 0.1,dy=0.1):

6.圖像的仿射變換

圖像的仿射變換其實就是以上基本變換的組合,仿射變換可以維持原圖的點線關系,例如平行和比例等。

示例代碼:

#include <opencv.hpp> #include <iostream> #include <imgproc.hpp>using namespace std; using namespace cv;int main() {Mat img = imread("img.jpg");Mat dst;Point2f affinePoints0[3] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50) }; // 選取原圖像的映射點Point2f affinePoints1[3] = { Point2f(200, 100), Point2f(200, 300), Point2f(500, 50) }; // 選取目標圖像的映射點Mat trans = getAffineTransform(affinePoints0, affinePoints1); // 獲得變換矩陣warpAffine(img, dst, trans, Size(img.cols, img.rows)); // 仿射變換for (int i = 0; i < 3; ++i) // 描點{circle(img, affinePoints0[i], 5, Scalar(0, 255, 255), -1);circle(dst, affinePoints1[i], 5, Scalar(0, 255, 255), -1);}imshow("src", img);imshow("dst", dst);waitKey(0);return 0; }

效果圖:

7.圖像的透視變換

圖像的透視變換和放射變換類似,不過選取的映射點為四個。

示例代碼:

#include <opencv.hpp> #include <iostream> #include <imgproc.hpp>using namespace std; using namespace cv;int main() {Mat img = imread("img.jpg");Mat dst;Point2f perspectivePoints0[4] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50),Point2f(600, 800) }; // 選取原圖像的映射點Point2f perspectivePoints1[4] = { Point2f(200, 100), Point2f(200, 300), Point2f(500, 50), Point2f(600, 800) }; // 選取目標圖像的映射點Mat trans = getPerspectiveTransform(perspectivePoints0, perspectivePoints1); // 獲得變換矩陣warpPerspective(img, dst, trans, Size(img.cols, img.rows)); // 透視變換for (int i = 0; i < 4; ++i) // 描點{circle(img, perspectivePoints0[i], 5, Scalar(0, 255, 255), -1);circle(dst, perspectivePoints1[i], 5, Scalar(0, 255, 255), -1);}imshow("src", img);imshow("dst", dst);waitKey(0);return 0; }

效果圖(額。):

轉載于:https://www.cnblogs.com/whlook/p/7302416.html

總結

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

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

主站蜘蛛池模板: 91最新地址永久入口 | 欧美亚洲韩国 | 美女污污网站 | 免费看黄色a级片 | 亚洲制服在线观看 | 99精品一区二区三区无码吞精 | 国产高清久久久 | 久久尤物 | 天堂va欧美ⅴa亚洲va一国产 | 中文字幕中出 | 国产成人激情 | 中国新婚夫妻性猛交 | 欧美20p| 丝袜 亚洲 另类 国产 制服 | 免费超碰在线观看 | 国产一区二区三区在线观看免费 | 欧美国产日韩在线观看 | 天堂婷婷| 欧美性视频一区二区三区 | 免费观看黄色 | www.黄色网| 亚洲国产第一 | 欧美又粗又深又猛又爽啪啪九色 | 国产精品入口麻豆 | 久久网站免费观看 | 爱爱小视频网站 | 成人人人人人欧美片做爰 | 18岁免费观看电视连续剧 | 黄色大片毛片 | 亚洲国产视频一区二区三区 | 亚洲国产一区二区三区 | 欧美va视频 | 国产精品边吃奶边做爽 | 欧美 亚洲 另类 偷偷 自拍 | 午夜探花视频 | 免费视频久久 | 亚洲综合色网站 | 毛片随便看 | 亚洲激情专区 | 伊人青青久 | 国产二区一区 | 久久99久久久久久 | 免费人成在线观看 | 艳妇av| 久久亚洲精品小早川怜子 | 毛片a片免费观看 | 亚洲精品国产视频 | 在线免费观看高清视频 | 久久免费精品 | 一级片aaa| 午夜在线影院 | 91蜜桃婷婷狠狠久久综合9色 | 国产在线观看精品 | 东方av在线播放 | いいなり北条麻妃av101 | 婷婷色婷婷 | xxxx69视频| 日本一道在线 | 大地资源影视在线播放观看高清视频 | 91精品国产入口在线 | 五月香蕉网 | 黄色免费在线视频 | 搞黄视频在线观看 | 亚洲一区二区三区视频 | 爱爱视频在线免费观看 | 在线免费播放 | 日韩欧美亚洲成人 | 成人羞羞在线观看网站 | 一级黄色性视频 | 什么网站可以看毛片 | 日韩在线欧美 | 欧美性天天影院 | 欧美日韩在线视频一区二区三区 | 91在线日本 | 天堂中文在线观看 | 亚洲成人黄色小说 | 亚洲免费一二三区 | 西西午夜影院 | 国产亚洲色婷婷久久99精品91 | 欧美日韩午夜爽爽 | 成人在线观看网址 | 色91精品久久久久久久久 | 国产日韩欧美视频在线观看 | 久草在在线视频 | 91丨九色丨蝌蚪丨对白 | 成人一区二区视频 | 91精品大片 | 国产一区视频观看 | 欧美一区二区三区四区在线 | 极品尤物在线观看 | 国产不卡毛片 | 日韩免费视频一区 | 蜜桃视频欧美 | 国产一区美女 | 网站黄色在线观看 | 久久久免费在线观看 | 天堂网2018 | 黄色中文字幕 | 夜夜欢视频 |