본문 바로가기

OpenCV없는 영상처리

영상처리의 전처리부

<!DOCTYPE html>
<html>
    <head>
        <script>
            ///////////////
            // 전역변수부
            ///////////////
            let inCanvas, inCtx, inPaper; // 입력 영상 관련
            let outCanvas, outCtx, outPaper; // 출력 영상 관련
            let inImage, inH, inW; // 2차원배열, 높이, 폭
            let outImage, outH, outW; // 2차원배열, 높이, 폭
            let inFile;

            ///////////////
            // 공통 함수부: Open(),Display()...
            ///////////////
            function init(){
                inCanvas = document.getElementById("inCanvas"); // 도화지
                inCtx = inCanvas.getContext("2d"); // 물감, 붓이 들은 통
                outCanvas = document.getElementById("outCanvas"); // 도화지
                outCtx = outCanvas.getContext("2d"); // 물감, 붓이 들은 통
                // alert("init()끝");
            }
            //파일에서 선택한 이미지를 inImage에 저장 및 출력
            function openImage() {
                    inFile = document.getElementById("inFile").files[0]; // 선택한 RAW 파일(LENNA512.RAW)
                    // (중요!) 선택한 이미지의 크기를 확인
                    inH = inW = Math.sqrt(inFile.size);//128, 256,512,1024...
                    // 이미지 크기의 메모리(2차원배열)를 확보
                    inImage = new Array(inH);
                    for (let i = 0; i < inH; i++)
                        inImage[i] = new Array(inW);
                    // 파일  --> 메모리
                    let reader = new FileReader();
                    reader.readAsBinaryString(inFile);
                    reader.onload = function () {
                        let blob = reader.result; // 파일을 한 덩어리(blob)으로 가져옴.
                        // 덩어리(blob)에서 한점한점 뽑아서, 배열에 넣기... 몇번 반복? 512x512
                        for (let i = 0; i < inH; i++) {
                            for (let k = 0; k < inW; k++) {
                                let sPixel = (i * inH + k); // 시작 위치
                                let ePixel = (i * inH + k) + 1; // 끝 위치
                                inImage[i][k] = blob.slice(sPixel, ePixel).charCodeAt(0); // 0~1까지 뽑아라. 0만 뽑힘.
                            }
                        }
                        // 도화기 크기를 이미지 크기로 조절
                        inCanvas.height = inH;
                        inCanvas.width = inH;
                        //** 입력 메모리(inImage)를 페이퍼에 콕콕 찍어서 출력한 후,  페이퍼를 캔버스에 떡 붙이기.
                        inPaper = inCtx.createImageData(inH, inW); // 이미지 크기의 빈 종이를 준비
                        for (let i = 0; i < inH; i++) {
                            for (let k = 0; k < inW; k++) {
                                let px = inImage[i][k];  //'뙓' -->  223
                                inPaper.data[(i * inH + k) * 4 + 0] = px; // Red
                                inPaper.data[(i * inH + k) * 4 + 1] = px; // Green
                                inPaper.data[(i * inH + k) * 4 + 2] = px; // Blue
                                inPaper.data[(i * inH + k) * 4 + 3] = 255; // Alpha (투명도)
                            }
                        }
                        inCtx.putImageData(inPaper, 0, 0);
                    }
                }
            //outImage를 출력할때 사용하는 함수
            function displayImage() {
                     outCanvas.height = outH;
                     outCanvas.width = outH;
                    outPaper = outCtx.createImageData(outH, outW); // 이미지 크기의 빈 종이를 준비
                     for (let i = 0; i < outH; i++) {
                         for (let k = 0; k < outW; k++) {
                              let px = outImage[i][k];  //'뙓' -->  223
                              outPaper.data[(i * outH + k) * 4 + 0] = px; // Red
                             outPaper.data[(i * outH + k) * 4 + 1] = px; // Green
                             outPaper.data[(i * outH + k) * 4 + 2] = px; // Blue
                                outPaper.data[(i * outH + k) * 4 + 3] = 255; // Alpha (투명도)
                            }
                        }
                        outCtx.putImageData(outPaper, 0, 0);
                    }
            //select 값을 받아와 그에 해당하는 함수를 실행
            function selectAlgorithm(selNum){
                switch(parseInt(selNum.value)){
                    case 101://동일영상
                        equalImage();break;
                    case 102://반전영상
                        reverseImage();break;
                    case 103://파라볼라(캡)
                        paraCap();break;

                    case 201:// 이동
                        moveImage();break;
                    case 202:// 회전
                        rotateImage();break;
                   
                    case 301:// 엠보싱
                        embossImage();break;
                    case 302:// 블러링
                        blurrImage();break;

                    case 401:// 스트레칭
                        stretchImage();break;
                    case 402:// 엔드-인
                        endInImage();break;
                    case 403:// 평활화
                        equalizeImage();break;
                }
            }
            </script>
    </head>
    <body onload="init()">
        <h1>영상처리 프로그램(GA, RTM, 1.0)</h1>
        <form>
        //파일선택
        <input type="file" id="inFile" onchange="openImage()"/> <br>
        //select에 이미지처리이름과 처리할 값을 매칭해놓음
        <select name="pixel" onchange="selectAlgorithm(this.form.pixel)">
            <option value="0">*화소점 처리*</option>
            <optgroup>
            <option value="101">동일 영상</option>
            <option value="102">영상 반전</option>
            <option value="103">파라볼라 (Cap)</option>
            </optgroup>
        </select>
        <select name="geometry" onchange="selectAlgorithm(this.form.geometry)">
            <option value="0">*기하학 처리*</option>
            <option value="201">이동</option>
            <option value="202">회전</option>
        </select>
    </select>
    <select name="area" onchange="selectAlgorithm(this.form.area)">
        <option value="0">*화소영역 처리*</option>
        <option value="301">엠보싱</option>
        <option value="302">블러링</option>
    </select>
    <select name="histo" onchange="selectAlgorithm(this.form.histo)">
        <option value="0">*히스토그램 처리*</option>
        <option value="401">스트레칭</option>
        <option value="402">엔드-인</option>
        <option value="403">평활화</option>
    </select>
        </form>
        <br>
        //inImage가 출력될 캔버스
        <canvas  id="inCanvas"  style="background-color:lightgreen"></canvas>
        //outImage가 출력될 캔버스
        <canvas  id="outCanvas"  style="background-color:rgb(95, 61, 173)"></canvas>
    </body>
</html>

'OpenCV없는 영상처리' 카테고리의 다른 글

히스토그램 처리  (0) 2022.09.11
화소영역처리  (0) 2022.09.11
기하학처리  (0) 2022.09.11
화소 점 처리  (0) 2022.09.11
인공지능과 영상처리  (0) 2022.09.11