亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

javascript圖像處理—仿射變換深度理解

 更新時(shí)間:2013年01月16日 09:06:37   作者:  
上一篇文章,我們講解了圖像金字塔,這篇文章我們來(lái)了解仿射變換,仿射?任何仿射變換都可以轉(zhuǎn)換成,乘以一個(gè)矩陣(線性變化),再加上一個(gè)向量(平移變化),接下來(lái)詳細(xì)介紹,感興趣的朋友可以了解下
前言

上一篇文章,我們講解了圖像金字塔,這篇文章我們來(lái)了解仿射變換。

仿射?

任何仿射變換都可以轉(zhuǎn)換成,乘以一個(gè)矩陣(線性變化),再加上一個(gè)向量(平移變化)。

實(shí)際上仿射是兩幅圖片的變換關(guān)系。

例如我們可以通過(guò)仿射變換對(duì)圖片進(jìn)行:縮放、旋轉(zhuǎn)、平移等操作。

一個(gè)數(shù)學(xué)問(wèn)題

在解決仿射問(wèn)題前,我們來(lái)做一個(gè)數(shù)學(xué)題。

如圖,對(duì)于點(diǎn)(x1, y1),相對(duì)于原點(diǎn)旋轉(zhuǎn)一個(gè)角度a,那么這個(gè)點(diǎn)到哪里了呢?

我們將坐標(biāo)系變成極坐標(biāo)系,則點(diǎn)(x1, y1)就變成了(r, β),而旋轉(zhuǎn)后變成(r, α+ β)。

轉(zhuǎn)回直角坐標(biāo)系,則旋轉(zhuǎn)后的點(diǎn)變成了(cos(α+ β) * r, sin(α+ β) * r)。

然后利用公式

cos(α+β)=cosαcosβ-sinαsinβ

sin(α+β)=sinαcosβ+cosαsinβ

以及原來(lái)點(diǎn)為(cosβ * r, sinβ * r),于是很容易得出新的點(diǎn)為(x1 * cosα - y1 * sinα, x1 * sinaα + y1 * cosα)。

我們可以從中推導(dǎo)出旋轉(zhuǎn)變換公式

那么平移就相對(duì)簡(jiǎn)單很多了,就相當(dāng)于加上一個(gè)向量(c, d)就行了。

獲得變換矩陣函數(shù)實(shí)現(xiàn)

通常我們使用2 \times 3矩陣來(lái)表示仿射變換。

A = \begin{bmatrix} a_{00} & a_{01} \\ a_{10} & a_{11} \end{bmatrix}_{2 \times 2} B = \begin{bmatrix} b_{00} \\ b_{10} \end{bmatrix}_{2 \times 1} M = \begin{bmatrix} A & B \end{bmatrix} =\begin{bmatrix} a_{00} & a_{01} & b_{00} \\ a_{10} & a_{11} & b_{10}\end{bmatrix}_{2 \times 3}

其中A是旋轉(zhuǎn)縮放變換,B是平移變換。則結(jié)果T滿足:

T = A \cdot \begin{bmatrix}x \\ y\end{bmatrix} + B 或者 

T = M \cdot [x, y, 1]^{T}

即:T = \begin{bmatrix} a_{00}x + a_{01}y + b_{00} \\ a_{10}x + a_{11}y + b_{10} \end{bmatrix}

復(fù)制代碼 代碼如下:

var getRotationArray2D = function(__angle, __x, __y){
var sin = Math.sin(__angle) || 0,
cos = Math.cos(__angle) || 1,
x = __x || 0,
y = __y || 0;

return [cos, -sin, -x,
sin, cos, -y
];
};

這樣我們就得到了一個(gè)仿射變換矩陣。

當(dāng)然這個(gè)實(shí)現(xiàn)本身是有一定問(wèn)題的,因?yàn)檫@個(gè)原點(diǎn)被固定在左上角了。

仿射變換實(shí)現(xiàn)

復(fù)制代碼 代碼如下:

var warpAffine = function(__src, __rotArray, __dst){
(__src && __rotArray) || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */);
if(__src.type && __src.type === "CV_RGBA"){
var height = __src.row,
width = __src.col,
dst = __dst || new Mat(height, width, CV_RGBA),
sData = new Uint32Array(__src.buffer),
dData = new Uint32Array(dst.buffer);

var i, j, xs, ys, x, y, nowPix;

for(j = 0, nowPix = 0; j < height; j++){
xs = __rotArray[1] * j + __rotArray[2];
ys = __rotArray[4] * j + __rotArray[5];
for(i = 0; i < width; i++, nowPix++, xs += __rotArray[0], ys += __rotArray[3]){

if(xs > 0 && ys > 0 && xs < width && ys < height){

y = ys | 0;
x = xs | 0;

dData[nowPix] = sData[y * width + x];
}else{
dData[nowPix] = 4278190080; //Black
}
}
}
}else{
error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */);
}
return dst;
};

這個(gè)函數(shù)先把矩陣數(shù)據(jù)變成32位形式,操作每個(gè)元素就等同于操作每一個(gè)像素。

然后遍歷所有元素,對(duì)對(duì)應(yīng)的點(diǎn)進(jìn)行賦值。

效果

 

相關(guān)文章

  • JavaScript多種頁(yè)面刷新方法小結(jié)

    JavaScript多種頁(yè)面刷新方法小結(jié)

    這篇文章主要介紹了JavaScript多種頁(yè)面刷新方法小結(jié),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • JS 實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單的幾種方式

    JS 實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單的幾種方式

    這篇文章主要介紹了JS 實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單的幾種方式的相關(guān)資料,這里提供了三種方式,和實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • 詳解前端安全之JavaScript防http劫持與XSS

    詳解前端安全之JavaScript防http劫持與XSS

    作為前端,一直以來(lái)都知道HTTP劫持與XSS跨站腳本、CSRF跨站請(qǐng)求偽造。防御這些劫持最好的方法是從后端入手,前端能做的太少。而且由于源碼的暴露,攻擊者很容易繞過(guò)防御手段。但這不代表我們?nèi)チ私膺@塊的相關(guān)知識(shí)是沒(méi)意義的,本文的許多方法,用在其他方面也是大有作用。
    2021-05-05
  • javascript中返回頂部按鈕的實(shí)現(xiàn)

    javascript中返回頂部按鈕的實(shí)現(xiàn)

    這篇文章主要介紹了使用javascript實(shí)現(xiàn)博客園頁(yè)面右下角返回頂部按鈕的思路及源碼,非常不錯(cuò),這里推薦給小伙伴們
    2015-05-05
  • 微信小程序?qū)崿F(xiàn)上傳圖片裁剪圖片過(guò)程解析

    微信小程序?qū)崿F(xiàn)上傳圖片裁剪圖片過(guò)程解析

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)上傳圖片裁剪圖片過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • js判斷變量是否空值的代碼

    js判斷變量是否空值的代碼

    判斷變量是否空值undefined, null, '', false, 0, [], {} 均返回true,否則返回false
    2008-10-10
  • JS數(shù)組交集、并集、差集的示例代碼

    JS數(shù)組交集、并集、差集的示例代碼

    本篇文章主要介紹了JS數(shù)組交集、并集、差集的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • js智能獲取瀏覽器版本UA信息的方法

    js智能獲取瀏覽器版本UA信息的方法

    下面小編就為大家?guī)?lái)一篇js智能獲取瀏覽器版本UA信息的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • 對(duì)采用動(dòng)態(tài)原型方式無(wú)法展示繼承機(jī)制得思考

    對(duì)采用動(dòng)態(tài)原型方式無(wú)法展示繼承機(jī)制得思考

    今天看書(shū),作者討論到能否采用動(dòng)態(tài)原型方法展示繼承機(jī)制,給出的答案是:不能。原因是prototype對(duì)象的唯一性??聪旅娲a(這段代碼不正確,卻值得研究)
    2009-12-12
  • javascript實(shí)現(xiàn)固定側(cè)邊欄

    javascript實(shí)現(xiàn)固定側(cè)邊欄

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)固定側(cè)邊欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02

最新評(píng)論