<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        Javascript圖像處理思路及實(shí)現(xiàn)代碼_javascript技巧

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:06:10
        文檔

        Javascript圖像處理思路及實(shí)現(xiàn)代碼_javascript技巧

        Javascript圖像處理思路及實(shí)現(xiàn)代碼_javascript技巧:思路 HTML5的canvas提供了getImageData接口來獲取canvas中的數(shù)據(jù),所以我們能夠先用drawImage接口將圖片畫在canvas上然后再通過getImageData得到圖片數(shù)據(jù)矩陣。 需要注意,雖然IE9開始支持了canvas接口,但是其getImageData獲取的數(shù)據(jù)并不是
        推薦度:
        導(dǎo)讀Javascript圖像處理思路及實(shí)現(xiàn)代碼_javascript技巧:思路 HTML5的canvas提供了getImageData接口來獲取canvas中的數(shù)據(jù),所以我們能夠先用drawImage接口將圖片畫在canvas上然后再通過getImageData得到圖片數(shù)據(jù)矩陣。 需要注意,雖然IE9開始支持了canvas接口,但是其getImageData獲取的數(shù)據(jù)并不是

        思路
        HTML5的canvas提供了getImageData接口來獲取canvas中的數(shù)據(jù),所以我們能夠先用drawImage接口將圖片畫在canvas上然后再通過getImageData得到圖片數(shù)據(jù)矩陣。

        需要注意,雖然IE9開始支持了canvas接口,但是其getImageData獲取的數(shù)據(jù)并不是以標(biāo)準(zhǔn)的TypedArray方式存儲(chǔ)的,或者說IE9沒有提供對(duì)WebGL Native binary data的支持,所以如果需要對(duì)IE9支持,下面的矩陣需要用Array的方式保存。雖然IE9以下版本(例如IE8)有開源項(xiàng)目explorercanvas提供canvas支持,但很可惜G_vmlCanvasManager并沒有提供位圖數(shù)據(jù)獲取接口。TypedArray的相關(guān)內(nèi)容可以參考HTML5的新數(shù)組

        基本矩陣
        在圖像處理中,矩陣計(jì)算是非常重要的內(nèi)容,所以我們首先來建立一個(gè)矩陣模型。
        通過getImageData接口獲取的ImageData雖然具有類似矩陣的結(jié)構(gòu),但是他的結(jié)構(gòu)是不可變的,不適合擴(kuò)展,所以我們選擇在Javascript中自建一個(gè)矩陣。
        代碼如下:
        function Mat(__row, __col, __data, __buffer){
        this.row = __row || 0;
        this.col = __col || 0;
        this.channel = 4;
        this.buffer = __buffer || new ArrayBuffer(__row * __col * 4);
        this.data = new Uint8ClampedArray(this.buffer);
        __data && this.data.set(__data);
        this.bytes = 1;
        this.type = "CV_RGBA";
        }

        row - 代表矩陣的行數(shù)
        col - 代表矩陣的列數(shù)
        channel - 代表通道數(shù)量,因?yàn)橥ㄟ^getImageData獲取的圖片數(shù)據(jù)是以RGBA色彩空間進(jìn)行描述的,即有Red(紅)、Green(綠)、Blue(藍(lán))和Alpha(不透明度)四個(gè)通道。
        buffer - 數(shù)據(jù)所用的ArrayBuffer引用。
        data - 圖片的Uint8ClampedArray數(shù)組數(shù)據(jù)。
        bytes - 每個(gè)數(shù)據(jù)單位占用字節(jié),因?yàn)槭莡int8數(shù)據(jù)類型,所以占用字節(jié)數(shù)為1。
        type - 數(shù)據(jù)類型是CV_RGBA。
        圖片數(shù)據(jù)轉(zhuǎn)成矩陣的方法
        代碼如下:
        function imread(__image){
        var width = __image.width,
        height = __image.height;
        iResize(width, height);
        iCtx.drawImage(__image, 0, 0);
        var imageData = iCtx.getImageData(0, 0, width, height),
        tempMat = new Mat(height, width, imageData.data);
        imageData = null;
        iCtx.clearRect(0, 0, width, height);
        return tempMat;
        }

        注意:這里的__image指的是Image對(duì)象,不是字符串URL。因?yàn)闉g覽器中Image的讀取是一個(gè)異步過程,并不能立刻返回相應(yīng)的Mat對(duì)象,所以這個(gè)函數(shù)應(yīng)當(dāng)這樣使用:
        代碼如下:
        var img = new Image();
        img.onload = function(){
        var myMat = cv.imread(img);
        };
        img.src = "1.jpg";

        iCtx和iResize方法是一個(gè)全局變量,允許給其它函數(shù)公用:
        代碼如下:
        var iCanvas = document.createElement("canvas"),
        iCtx = iCanvas.getContext("2d");
        function iResize(__width, __height){
        iCanvas.width = __width;
        iCanvas.height = __height;
        }

        我們來看一下drawImage方法:
        用途
        在canvas上繪制一個(gè)圖片。
        語法
        context.drawImage(img,x,y);
        context.drawImage(img,x,y,width,height);
        context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
        例子
        還有g(shù)etImageData方法:
        用途
        獲取canvas中的圖像數(shù)據(jù)。
        數(shù)據(jù)是以RGBA色彩空間返回的,即:
        R - 紅色通道大小
        G - 綠色通道大小
        B - 藍(lán)色通道大小
        A - 不透明程度大小
        語法
        context.getImageData(x,y,width,height);
        例子
        代碼如下:
        red = imgData.data[0];
        green = imgData.data[1];
        blue = imgData.data[2];
        alpha = imgData.data[3];

        矩陣轉(zhuǎn)成圖像數(shù)據(jù)的方法
        經(jīng)過處理后的矩陣,需要一個(gè)方法變成ImageData,然后我們就可以通過putImageData方法,在canvas上繪制經(jīng)過處理的圖像了。
        代碼如下:
        function RGBA2ImageData(__imgMat){
        var width = __imgMat.col,
        height = __imgMat.row,
        imageData = iCtx.createImageData(width, height);
        imageData.data.set(__imgMat.data);
        return imageData;
        }

        我們來看一下putImageData方法:
        用途
        通過圖像數(shù)據(jù),在canvas上繪制圖像。
        語法
        context.putImageData(imgData,x,y,dirtyX,dirtyY,dirtyWidth,dirtyHeight);
        將彩色圖轉(zhuǎn)換成灰度圖
        最后我們進(jìn)行一個(gè)簡單的色彩空間變換,將圖像從RGBA轉(zhuǎn)成GRAY。
        代碼如下:
        function cvtColor(__src){
        if(__src.type && __src.type === "CV_RGBA"){
        var row = __src.row,
        col = __src.col;
        var dst = new Mat(row, col);
        data = dst.data,
        data2 = __src.data;
        var pix1, pix2, pix = __src.row * __src.col * 4;
        while (pix){
        data[pix -= 4] = data[pix1 = pix + 1] = data[pix2 = pix + 2] = (data2[pix] * 299 + data2[pix1] * 587 + data2[pix2] * 114) / 1000;
        data[pix + 3] = data2[pix + 3];
        }
        }else{
        return src;
        }
        return dst;
        }

        參考OpenCV文檔中的轉(zhuǎn)換公式:
        RGBA to Gray: Y <- 0.299 * R + 0.587 * G + 0.114 * B
        Gray to RGBA: R <- Y, G <- Y, B <- Y, A <- 255
        我們可以得出RGBA to GRAY(指的是擁有4個(gè)通道)對(duì)應(yīng)映射關(guān)系應(yīng)該為:
        RGBA to RGBA(GRAY): R1 = G1 = B1 <- 0.299 * R + 0.587 * G + 0.114 * B , A1 <- A

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Javascript圖像處理思路及實(shí)現(xiàn)代碼_javascript技巧

        Javascript圖像處理思路及實(shí)現(xiàn)代碼_javascript技巧:思路 HTML5的canvas提供了getImageData接口來獲取canvas中的數(shù)據(jù),所以我們能夠先用drawImage接口將圖片畫在canvas上然后再通過getImageData得到圖片數(shù)據(jù)矩陣。 需要注意,雖然IE9開始支持了canvas接口,但是其getImageData獲取的數(shù)據(jù)并不是
        推薦度:
        標(biāo)簽: js 圖像處理 javascript技巧
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产zzjjzzjj视频全免费| 歪歪漫画在线观看官网免费阅读| 日韩免费视频在线观看| 亚洲人成图片网站| 在线观看成人免费| 国产亚洲中文日本不卡二区 | 亚洲AV无码一区二区三区鸳鸯影院 | 亚洲一区二区影院| 免费国产黄网站在线观看可以下载 | 亚洲一级片在线播放| 在线视频精品免费| 最新亚洲卡一卡二卡三新区| 成人毛片视频免费网站观看| 色窝窝亚洲AV网在线观看| 午夜亚洲av永久无码精品| 黄色视频在线免费观看| 久久久亚洲精品无码| 国产成人精品久久免费动漫| 中文日韩亚洲欧美制服| 免费永久国产在线视频| 国产精品福利在线观看免费不卡 | 亚洲手机中文字幕| 黑人粗长大战亚洲女2021国产精品成人免费视频| 亚洲一区二区三区在线网站| 国产无遮挡又黄又爽免费视频| 一区二区免费国产在线观看| 亚洲AV无码专区在线播放中文| 亚洲网站在线免费观看| 亚洲av无码有乱码在线观看| 综合亚洲伊人午夜网 | 奇米影视亚洲春色| 222www免费视频| 亚洲成在人线在线播放无码 | 黄色成人网站免费无码av| 日本特黄特色AAA大片免费| 亚洲AV日韩AV永久无码绿巨人 | 在线观看肉片AV网站免费| 99999久久久久久亚洲| 亚洲一区二区三区国产精品| 99国产精品免费视频观看| 香蕉视频亚洲一级|