首頁 web前端 js教程 Javascript影像處理—為矩陣新增常用方法_javascript技巧

Javascript影像處理—為矩陣新增常用方法_javascript技巧

May 16, 2016 pm 05:45 PM
影像 矩陣

前言
上一篇文章,我們定義了矩陣,這篇文章我們來為矩陣增加一些常用方法。

toString方法
toString方法通常用作將物件轉成字串描述,所以我們將此方法定義為輸出矩陣元素。
複製程式碼 程式碼如下:

Mat.prototype.toString = function(){
>var tempData = this.data,
text = "Mat(" this.type ") = {n",
num = this.col * this.channel;
for(var i = 0; i text = "["
for(var j = 0; j text = (tempData[i * num j] "," );
}
text = "]n";
}
text = "}";
return text;
};

這樣,我們就可以用:
複製程式碼 程式碼如下:

console.log(mat) ;

來輸出矩陣了。

clone方法
實際上,我們可以透過建構函式進行複製操作,不過依然提供一個方法來方便記憶、使用。
複製程式碼 程式碼如下:

Mat.prototype.clone = function(){
>return new Mat(this.row, this.col, this.data);
};

取得指定元素
我們有兩種方法獲取矩陣元素。

陣列方法
由於實際上Mat是以陣列形式保存資料的,而資料看起來是這樣的:
R00 G00 B00 A00 R01 G01 B01 A01 … R0n G0n B0n A0n
R10 G10 B10 A10 R11 G11 B11 A11 …… R1n G1n B1n A1n
……
Rm0 Gm0 Bm0 Am0 Rm1 Gm1 Bm111, Nmn G、B、A分別代表各通道的數值,而下標第一個表示行號,第二個表示列號。即第k行,第j列的G通道數值就是Gkj。
我們很容易得到對於一個Mat類型的mat來說,第k行,第j列像素的每個元素分別是:
Rkj = mat.data[(k * mat.col j) * 4 0]
Gkj = mat.data[(k * mat.col j) * 4 1]
Bkj = mat.data[(k * mat.col j) * 4 2]
Akj = mat .data[(k * mat.col j) * 4 3]


Buffer部分引用方法 透過Buffer的部分引用,我們可以得到矩陣的部分引用,例如我們可以利用這個來取得一個像素點的資料數組,而改變這個數組中的值,對應的矩陣資料也會改變;再例如我們可以以其他資料類型的方式讀取資料。而這些對於普通Array是不能實現的。下面我們來看看at方法的實作:

複製程式碼 程式碼如下:
Mat. prototype.at = function(__type, __x, __y){
var type = __type,
x = __x || 0,
y = __y || 0,
rowLen = this.col * this.channel * this.bytes,
len = 1;
if(type.indexOf("Vec") > -1){
var temp = __type.match(/Vec(d )([ a-z])/);
len = parseInt(temp[1]);
switch(temp[2]){
case "b":
type = "uchar";
break;
case "s":
type = "short";
break;
case "i":
type = "int";
break;
case "f":
type = "float";
break;
case "d":
type = "double";
break;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
switch(type){
case "uchar":
return new Uint8Array(this.buffer, (y * rowLen x), len);
break;
case "short":
return new Int16Array(this.buffer, (y * rowLen x * 2), len);
break;
case "int":
return new Int32Array(this.buffer, (y * rowLen x * 4), len);
break; case "float": return new Float32Array(this.buffer, (y * rowLen x * 4), len); break; case "doulble": return new Float64Array(this.buffer, (y * rowLen x * 8), len); break; default: console.error("不支援資料型態"); } };
如果你對ArrayBuffer和TypedArray還不太清楚,可以參考:HTML5 中的新陣列。
String type - 需要傳回的資料類型。支援:
uchar 無符號8位元整數
short 有符號16位元整數
int 有符號32位元整數
float 有符號32位元浮點數
double 有符號64位元浮點數

Vec 向量形式
向量形式字串拼字是:Vec (型) (個數),例如Vecb4就是4個無符號8位元整數,這是常見的得到一個像素點資料的方法,例如為了得到mat第j行,第k列的像素數據,可以使用:
複製程式碼程式碼如下:

mat.at("Vecb4", j, k);

int x - 要取得的元素在矩陣的行數。
int y - 要取得的元素在矩陣的列數。

getRow方法和getCol方法
類似at的實作方法,我們可以輕易寫出取得某一行或某一列的方法:
複製程式碼 程式碼如下:

Mat.prototype.getRow = function(__i){
var len = this.col * this.channel,
rowLen = len * this.bytes,
i = __i || 0;
return new this.data.constructor(this.buffer, i * rowLen, len);
};

複製程式碼 程式碼如下:


程式碼如下:


.getCol = function(__i){
var len = this.col * this.channel,
rowLen = len * this.bytes,
array = [],
i = __i || 0 ;
function getAllElement(__constructor){
var row = this.row,
channel = this.channel;
for(var j = 0; j array .push(new __constructor(this.buffer, j * rowLen i, 1 * channel));
}
}
getAllElement(this.data.constructor);
return array; };

複製程式碼


程式碼如下:


Mat.prototype.rowRange = function(__i, __j){
var len = this.col * this.channel,
rowLen = len * this.bytes,
array = [],
i = __i || 0,
j = __j || this.row;
function getAllElement (__constructor){
var row = this.row;
for(var k = i; k array.push(new __constructor(this.buffer, k * rowLen, len));
}
}
getAllElement(this.data.constructor);
return array; }; };


複製程式碼


程式碼如下:


Mat.prototype.colRange = function(__i, __j){
var len = this. col * this.channel,
rowLen = len * this.bytes,
array = [],
i = __i || 0,
j = __j || this.col;
function getAllElement(__constructor){
var row = this.row
channel = this.channel;
for(var k = 0; k array.push(new __constructor (this.buffer, k * rowLen __i, (__j - __i 1) * channel));
} } getAllElement(Float64Array); return array; > 這四種方法回傳的都是一種Array的陣列。如果要取得這個陣列rect第j行,第k列的元素,則可用: rect[j][k]
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在 Windows 11 中清除桌面背景最近的影像歷史記錄 如何在 Windows 11 中清除桌面背景最近的影像歷史記錄 Apr 14, 2023 pm 01:37 PM

<p>Windows 11 改進了系統中的個人化功能,這使用戶可以查看先前所做的桌面背景變更的近期歷史記錄。當您進入windows系統設定應用程式中的個人化部分時,您可以看到各種選項,而更改背景桌布也是其中之一。但是現在可以看到您系統上設置的背景壁紙的最新歷史。如果您不喜歡看到此內容並想清除或刪除此最近的歷史記錄,請繼續閱讀這篇文章,它將幫助您詳細了解如何使用註冊表編輯器進行操作。 </p><h2>如何使用登錄編輯

如何在電腦上下載 Windows 聚光燈桌布影像 如何在電腦上下載 Windows 聚光燈桌布影像 Aug 23, 2023 pm 02:06 PM

窗戶從來不是一個忽視美學的人。從XP的田園綠場到Windows11的藍色漩渦設計,預設桌面桌布多年來一直是用戶愉悅的來源。借助WindowsSpotlight,您現在每天都可以直接存取鎖定螢幕和桌面桌布的美麗、令人敬畏的圖像。不幸的是,這些圖像並沒有閒逛。如果您愛上了Windows聚光燈圖像之一,那麼您將想知道如何下載它們,以便將它們作為背景保留一段時間。以下是您需要了解的所有資訊。什麼是WindowsSpotlight?窗口聚光燈是一個自動壁紙更新程序,可以從“設定”應用中的“個性化&gt

探索人工智慧歷史與矩陣:人工智慧教學(二) 探索人工智慧歷史與矩陣:人工智慧教學(二) Nov 20, 2023 pm 05:25 PM

在本系列的第一篇文章中,我們討論了人工智慧、機器學習、深度學習、資料科學等領域的關聯和差異。我們也為整個系列將使用的程式語言、工具等做出了一些艱難的選擇。最後,我們也介紹了一點矩陣的知識。在本文中,我們將深入討論人工智慧的核心——矩陣。不過在此之前,我們先來了解一下人工智慧的歷史我們為什麼需要了解人工智慧的歷史呢?歷史上曾出現過多次人工智慧熱潮,但在許多情況下,對人工智慧潛力的巨大期望都未能達成。了解人工智慧的歷史,有助於讓我們看清這次人工智浪潮是會創造奇蹟,抑或只是另一個即將破滅的泡沫。我們

如何在Python中使用影像語意分割技術? 如何在Python中使用影像語意分割技術? Jun 06, 2023 am 08:03 AM

隨著人工智慧技術的不斷發展,影像語意分割技術已成為影像分析領域的熱門研究方向。在影像語意分割中,我們將一張影像中的不同區域進行分割,並對每個區域進行分類,從而達到對這張影像的全面理解。 Python是一種著名的程式語言,其強大的資料分析和資料視覺化能力使其成為了人工智慧技術研究領域的首選。本文將介紹如何在Python中使用影像語意分割技術。一、前置知識在深入

iOS 17:如何在照片中使用一鍵裁剪 iOS 17:如何在照片中使用一鍵裁剪 Sep 20, 2023 pm 08:45 PM

透過iOS17照片應用,Apple可以更輕鬆地根據您的規格裁剪照片。繼續閱讀以了解如何操作。以前在iOS16中,在「照片」應用程式中裁剪圖像涉及幾個步驟:點擊編輯介面,選擇裁剪工具,然後透過捏合縮放手勢或拖曳裁剪工具的角落來調整裁剪。在iOS17中,值得慶幸的是,蘋果簡化了這個過程,這樣當你放大照片庫中任何選定的照片時,一個新的「裁剪」按鈕會自動出現在螢幕的右上角。點擊它會彈出完整的裁剪介面,其中包含您選擇的縮放級別,因此您可以裁剪到您喜歡的圖像部分,旋轉圖像,反轉圖像,或應用螢幕比例,或使用標記

如何在Windows上使用PowerToys批次調整影像大小 如何在Windows上使用PowerToys批次調整影像大小 Aug 23, 2023 pm 07:49 PM

那些必須每天處理圖像檔案的人經常不得不調整它們的大小以適應他們的專案和工作的需求。但是,如果要處理的圖像太多,則單獨調整它們的大小會消耗大量時間和精力。在這種情況下,像PowerToys這樣的工具可以派上用場,除此之外,可以使用其影像調整大小器實用程式批次調整影像檔案的大小。以下是設定影像調整器設定並開始使用PowerToys批次調整影像大小的方法。如何使用PowerToys批次調整影像大小PowerToys是一個多合一的程序,具有各種實用程式和功能,可協助您加快日常任務。它的實用程式之一是圖像

如何使用 iOS 17 在 iPhone 上編輯照片 如何使用 iOS 17 在 iPhone 上編輯照片 Nov 30, 2023 pm 11:39 PM

行動攝影從根本上改變了我們捕捉和分享生活瞬間的方法。智慧型手機的出現,尤其是iPhone,在這一轉變中發揮了關鍵作用。 iPhone以其先進的相機技術和用戶友好的編輯功能而聞名,已成為業餘和經驗豐富的攝影師的首選。 iOS17的推出標誌著這趟旅程中的一個重要里程碑。 Apple的最新更新帶來了一套增強的照片編輯功能,為用戶提供了一個更強大的工具包,將他們的日常快照變成視覺上引人入勝且藝術豐富的圖像。這種技術的發展不僅簡化了攝影過程,還為創意表達開闢了新的途徑,使用戶能夠毫不費力地為他們的照片注入專業氣息

計算矩陣右對角線元素總和的Python程序 計算矩陣右對角線元素總和的Python程序 Aug 19, 2023 am 11:29 AM

一種受歡迎的通用程式語言是Python。它被應用於各種行業,包括桌面應用程式、網頁開發和機器學習。幸運的是,Python具有簡單易懂的文法,適合初學者使用。在本文中,我們將使用Python來計算矩陣的右對角線總和。什麼是矩陣?在數學中,我們使用一個矩形排列或矩陣,用於描述一個數學物件或其屬性,它是一個包含數字、符號或表達式的矩形數組或表格,這些數字、符號或表達式按行和列排列。例如−234512367574因此,這是一個有3行4列的矩陣,表示為3*4矩陣。現在,矩陣中有兩條對角線,即主對角線和次對

See all articles