opencv:圖像的基本變換

0.概述

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

普通坐標關系:
966409-20170807225444330-88990486.png

圖像坐標關系:

966409-20170807225506065-116154409.png

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()); // 按照原圖大小和格式創建一個空白圖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.圖像的旋轉

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

基本映射關系:

966409-20170807225417002-852769798.png

我們只需要根據這個映射關系寫就好,其中的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; // 根據映射公式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; // 根據映射公式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.圖像的錯切

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

966409-20170807230556549-1487315611.png

不過對于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):

966409-20170807230831612-460644424.png

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;
}

效果圖:

966409-20170808175358433-460087543.png

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;
}

效果圖(額。):

966409-20170808230535933-581378872.png

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454975.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFMpeg在Windows環境下的編譯

1&#xff0e;安裝MinGW &#xff08;1&#xff09;下載文件&#xff1a;MinGW-5.1.4.exe&#xff0c; &#xff08;2&#xff09;安裝時選擇下列組件&#xff1a; binutils-2.19.1-mingw32-bin.tar.gz gcc-core-3.4.5-20060117-3.tar.gz gcc-g-3.4.5-20060117-3.tar.gz …

中通知設置響鈴_主動切斷干擾源——手機“通知”精細化管理

上周去參加我福福幼兒園的母親節活動&#xff0c;內容是孩子和家長一起穿手鏈。期間我發現和我同桌的一個家長的手機不停在響&#xff0c;當然伴隨著注意力被打斷。不僅是這位家長自己&#xff0c;連我也受到了干擾。于是職業病又犯了&#xff0c;我悄悄的看了一眼這位家長的手…

OCM_第十九天課程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 應用/DATA GUARD 搭建...

注&#xff1a;本文為原著&#xff08;其內容來自 騰科教育培訓課堂&#xff09;。閱讀本文注意事項如下&#xff1a;1&#xff1a;所有文章的轉載請標注本文出處。2&#xff1a;本文非本人不得用于商業用途。違者將承當相應法律責任。3&#xff1a;該系列文章目錄列表&#xf…

python安裝各種插件

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pip 感受&#xff1a;如果編輯pip真的一直出問題&#xff0c;考慮降成32位的進行安裝。畢竟合理搭配比木桶突出有用。轉載于:https://www.cnblogs.com/osmondwang/p/7307678.html

編寫數學公式的好工具

2019獨角獸企業重金招聘Python工程師標準>>> http://private.codecogs.com/latex/eqneditor.php 轉載于:https://my.oschina.net/yizhichao/blog/1542153

dev gridview 打印列數過多_R語言:如何將多張統計圖繪制在一張上面

在使用R語言進行數據可視化的時候&#xff0c;常常需要將多張統計圖表繪制在同一張圖上面&#xff0c;從而更高效地傳遞信息&#xff0c;下面我們就來一起看看具體如何實現。一、使用R語言自帶的函數繪制的圖像R語言本身就已經內置了許多繪圖函數&#xff0c;能夠滿足較為基本的…

264分析兩大利器 和 視頻系列下載:264VISA和Elecard StreamEye Tools

學了264有將近3個月有余&#xff0c;好多時候都在學習老畢的書和反復看JM86的代碼&#xff0c;最近才找到264分析兩大利器&#xff1a;264VISA和Elecard StreamEye Tools。不由得感嘆&#xff0c;恨不逢同時。 簡單的說下這兩個軟件&#xff1a; 264visa 強力的h264實時分析工具…

[轉]vue全面介紹--全家桶、項目實例

慢慢了解vue及其全家桶的過程 原文http://blog.csdn.net/zhenghao35791/article/details/67639415 簡介 “簡單卻不失優雅&#xff0c;小巧而不乏大匠”。 2016年最火的前端框架當屬Vue.js了&#xff0c;很多使用過vue的程序員這樣評價它&#xff0c;“vue.js兼具angular.js和R…

opencv 星空_opencv如何將大于5000像素點的輪廓繪制出來?

contourArea函數的運用。具體例子可以看下面的。《如何獲得物體的主要方向&#xff1f;》代碼略解&#xff1a;1、讀入圖片&#xff0c;尋找輪廓&#xff1b;//讀入圖像&#xff0c;轉換為灰度Mat img imread("e:/sandbox/pca1.jpg");Mat bw;cvtColor(img, bw, COLO…

TS 188字節流結構圖

應該說真正了解TS&#xff0c;還是看了朋友推薦的《數字電視業務信息及其編碼》一書之后&#xff0c;MPEG2 TS和數字電視是緊密不可分割的&#xff0c;值得總結一下其中的一些關系。 ISO/IEC&#xff0d;13818&#xff0d;1&#xff1a;系統部分&#xff1b; ISO/IEC&#xff…

二進制安裝mysql 5.7、mariadb (附yum安裝方式)

前言&#xff1a;本文以mariadb為例進行講解&#xff0c;安裝mysql同理&#xff0c;并以通過測試。安裝前查找系統已安裝的相關包&#xff08;rpm -qa|grep -e "mysql" -e "mariadb"&#xff09;并進行卸載。1、準備mariadb存儲數據庫文件的目錄。mkdir -p…

GLSL/C++ 實現濾鏡效果

入門效果之浮雕 "浮雕"圖象效果是指圖像的前景前向凸出背景。常見于一些紀念碑的雕刻上。要實現浮雕事實上很easy。我們把圖象的一個象素和左上方的象素進行求差運算。并加上一個灰度。這個灰度就是表示背景顏色。這里我們設置這個插值為128 (圖象RGB的值是0-255)。同…

cv mat的shape_pybind11—opencv圖像處理(numpy數據交換)

前言C opencv中圖像和矩陣的表示采用Mat類&#xff0c;比如imread()讀取的結果就是返回一個Mat對象。對于python而言&#xff0c;numpy 通常用于矩陣運算&#xff0c; 矩陣&#xff0c;圖像表示為numpy.ndarray類。因此&#xff0c;想要將python numpy.ndarray的數據傳遞到C op…

H.264算法的優化策略

文章來源&#xff1a; http://www.tichinese.com/Article/Video/200909/2150.html 編輯&#xff1a;小乙哥 1 代碼優化的主要方法 通過代碼移植能夠獲得在DSP上初步運行的代碼&#xff0c;但是它由于沒有考慮到DSP自身的硬件特點&#xff0c;不適合DSP強大的并行處理能力&#…

吃飯、睡覺、打星星之“打星星”!

大家見過這樣的星星么&#xff1f; 你想要多少就可以多少的星星&#xff01;&#xff01;&#xff01; 下面我們就來用奇妙的JavaScript來實現 首先我們要引入一個輸入包 let readline require("readline-sync");然后再讓客戶輸入數字&#xff0c;并將其存放起來con…

mysql 自動分表_Mysql Event 自動分表

create table TempComments Like dycomments;上述 SQL語句創建的新表帶有原表的所有屬性&#xff0c;主鍵&#xff0c;索引等。自動分表怎么做呢&#xff1f;使用上述語句自動創建分表。那么ID怎么設置呢&#xff1f;更改表格自增主鍵的起始值 例如 表格為 xxx_201604 那么將起…

《大道至簡》周愛民讀后感

作為一個準大二的軟件工程系的學生&#xff0c;初讀此書&#xff0c;很多部分是不太容易理解的&#xff0c;自己又沒有經歷過&#xff0c;感覺差了一個高度似的。自己讀的挺蒙&#xff0c;于是就去百度了一下這本書的讀后感&#xff0c;看看別人讀懂了什么&#xff0c;許多的評…

使用iconv-lite解決node當中不支持GBK編碼的問題

1、Node環境當中不支持GBK編碼 node.js當中的Buffer對象支持的編碼格式的種類有限&#xff0c;大概有ascii、utf8、utf16le、ucs2、base64、binary、hex。不支持GBK的編碼形式。對于windows系統來說&#xff0c;由于歷史原因&#xff0c;許多文件默認的編碼格式均為GBK。 比如我…

c1

dmg和package是安裝文件&#xff0c;dmg直接拖進應用程序中&#xff0c;pkg要進行安裝。 playfround是swift項目。--ios -----oc&#xff08;面向對象的C&#xff09; -----swift(oc的封裝)1963年劍橋大學退出cpl,1967年對cpl簡化推出bcpl&#xff0c;1970貝爾實驗室對bcpl簡化…

mysql必_MySQL必知必會(一)

摘自《MySQL必知必會》1.1.1 什么是數據庫數據庫&#xff1a;保存有組織的數據的容器(通常是一個文件或一組文件)人們通常用數據庫這個術語來代表他們使用的數據庫軟件。這是不正確的&#xff0c;它是引起混淆的根源。確切地說&#xff0c;數據庫軟件應稱為DBMS(數據庫管理系統…