코딩 연습장/Javascript

자바스크립트 영상 처리 코딩

Do아 2021. 3. 24. 00:47
728x90

2021/03/24(화)

 

 

 

 

엠보싱 처리하는 메소드

- 2개의 사진중에 선택을 받아 선택한 사진을 엠보싱처리

3x3 영역으로 처리

inImageArray : 첫번째 사진이 저장되어 있는 배열

secondImageArray : 두번째 사진이 저장되어 있는 배열

 

//엠보싱
        function embossImage() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            //엠보싱 화소 영역 처리
            var mask = [[-1., 0., 0.],
            [0., 0., 0.],
            [0., 0., 1.]];
            if (inputSelectImage == 1) {



                //입시 입력 배열
                tmpInputArray = new Array(inHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < inHeight + 2; i++)
                    tmpInputArray[i] = new Array(inWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + 1][k + 1] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        tmpOutputArray[i][k] += 127.0;
                    }
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255.0) {
                            v = 255.0;
                        }
                        else if (v < 0.0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();
            }



            else if (inputSelectImage == 2) {
                //엠보싱 화소 영역 처리

                //입시 입력 배열
                tmpInputArray = new Array(secondHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < secondHeight + 2; i++)
                    tmpInputArray[i] = new Array(secondWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + 1][k + 1] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        tmpOutputArray[i][k] += 127.0;
                    }
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255.0) {
                            v = 255.0;
                        }
                        else if (v < 0.0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();

            }
        }

 

블러싱처리 메소드

//블러싱
        function blurrImage() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            // 화소 영역 처리
            var mask = [[1 / 9., 1 / 9., 1 / 9.],
            [1 / 9., 1 / 9., 1 / 9.],
            [1 / 9., 1 / 9., 1 / 9.]];

            if (inputSelectImage == 1) {
                //입시 입력 배열
                tmpInputArray = new Array(inHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < inHeight + 2; i++)
                    tmpInputArray[i] = new Array(inWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + 1][k + 1] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();

            }
            else if (inputSelectImage == 2) {

                //입시 입력 배열
                tmpInputArray = new Array(secondHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < secondHeight + 2; i++)
                    tmpInputArray[i] = new Array(secondWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + 1][k + 1] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();
            }
        }

 

샤프닝 처리 메소드

//샤프닝
        function sharpeImage() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            // 화소 영역 처리
            var mask = [[0., -1., 0.],
            [-1., 5., -1.],
            [0., -1., 0.]];

            if (inputSelectImage == 1) {

                //입시 입력 배열
                tmpInputArray = new Array(inHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < inHeight + 2; i++)
                    tmpInputArray[i] = new Array(inWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + 1][k + 1] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();
            }

            else if (inputSelectImage == 2) {

                //입시 입력 배열
                tmpInputArray = new Array(secondHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < secondHeight + 2; i++)
                    tmpInputArray[i] = new Array(secondWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + 1][k + 1] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();
            }

        }

 

고주파샤프닝 메소드

//고주파 샤프닝
        function hpfSharpeImage() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            //화소 영역 처리
            var mask = [[-1 / 9., -1 / 9., -1 / 9.],
            [-1 / 9., 8 / 9., -1 / 9.],
            [-1 / 9., -1 / 9., -1 / 9.]];

            if (inputSelectImage == 1) {

                //입시 입력 배열
                tmpInputArray = new Array(inHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < inHeight + 2; i++)
                    tmpInputArray[i] = new Array(inWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + 1][k + 1] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += 100 * mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }


                //만약, 마스크의 합계가 0이면, 결과를 35 더하자.
                // for (var i = 0; i < inHeight; i++)
                //     for (var k = 0; k < inWidth; k++) {
                //         tmpOutputArray[i][k] += 35.0;
                //     }


                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();
            }

            else if (inputSelectImage == 2) {

                //입시 입력 배열
                tmpInputArray = new Array(secondHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < secondHeight + 2; i++)
                    tmpInputArray[i] = new Array(secondWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + 1][k + 1] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();
            }

        }

 

가우시처리 메소드

 //가우시
        function gaussianImage() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            //화소 영역 처리
            var mask = [[1 / 16., 1 / 8., 1 / 16.],
            [1 / 8., 1 / 4., 1 / 8.],
            [1 / 16., 1 / 8., 1 / 16.]];

            if (inputSelectImage == 1) {

                //입시 입력 배열
                tmpInputArray = new Array(inHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < inHeight + 2; i++)
                    tmpInputArray[i] = new Array(inWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + 1][k + 1] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        tmpOutputArray[i][k] += 127.0;
                    }
                */

                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();
            }

            else if (inputSelectImage == 2) {

                //입시 입력 배열
                tmpInputArray = new Array(secondHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < secondHeight + 2; i++)
                    tmpInputArray[i] = new Array(secondWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + 1][k + 1] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();
            }
        }

 

유사연산자 메소드

//유사연산자
        function onHomogenOperator() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

           


            if (inputSelectImage == 1) {

                tempInArray = new Array(inHeight + 2);
                for (var i = 0; i < inHeight + 2; i++)
                    tempInArray[i] = new Array(inWidth + 2);
                // 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tempInArray[i][k] = String.fromCharCode(127);
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tempInArray[i + 1][k + 1] = inImageArray[i][k];
                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var max = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                pixel = Math.abs(tempInArray[i + 1][k + 1].charCodeAt(0) - tempInArray[i + m][k + n].charCodeAt(0));
                                if (pixel >= max)
                                    max = pixel;
                            }
                        inImageArray[i][k] = max;
                        if (inImageArray[i][k] > 255)
                            inImageArray[i][k] = 255;
                        if (inImageArray[i][k] < 0)
                            inImageArray[i][k] = 0;
                        inImageArray[i][k] = String.fromCharCode(inImageArray[i][k]);
                    }
                }

                printOutInImage();
            }

            else if (inputSelectImage == 2) {

                tempInArray = new Array(secondHeight + 2);
                for (var i = 0; i < secondHeight + 2; i++)
                    tempInArray[i] = new Array(secondWidth + 2);
                // 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tempInArray[i][k] = String.fromCharCode(127);
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tempInArray[i + 1][k + 1] = secondImageArray[i][k];
                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var max = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                pixel = Math.abs(tempInArray[i + 1][k + 1].charCodeAt(0) - tempInArray[i + m][k + n].charCodeAt(0));
                                if (pixel >= max)
                                    max = pixel;
                            }
                        secondImageArray[i][k] = max;
                        if (secondImageArray[i][k] > 255)
                            secondImageArray[i][k] = 255;
                        if (secondImageArray[i][k] < 0)
                            secondImageArray[i][k] = 0;
                        secondImageArray[i][k] = String.fromCharCode(secondImageArray[i][k]);
                    }
                }

                printOutSecondImage();
            }
        }

 

LoG 메소드

 //LoG
        function LaplacianImage() {
            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            //화소 영역 처리
            var mask = [[-1., -1., -1.],
            [-1., 8., -1.],
            [-1., -1., -1.]];

            if (inputSelectImage == 1) {

                //입시 입력 배열
                tmpInputArray = new Array(inHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < inHeight + 2; i++)
                    tmpInputArray[i] = new Array(inWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < inHeight + 2; i++)
                    for (var k = 0; k < inWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + 1][k + 1] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }


                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                // for (var i = 0; i < inHeight; i++)
                //     for (var k = 0; k < inWidth; k++) {
                //         tmpOutputArray[i][k] += .0;
                //     }


                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();
            }

            else if (inputSelectImage == 2) {

                //입시 입력 배열
                tmpInputArray = new Array(secondHeight + 2); // 2칸 큰 배열
                for (var i = 0; i < secondHeight + 2; i++)
                    tmpInputArray[i] = new Array(secondWidth + 2);

                //임시 배열 초기화
                for (var i = 0; i < secondHeight + 2; i++)
                    for (var k = 0; k < secondWidth + 2; k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + 1][k + 1] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < 3; m++)
                            for (var n = 0; n < 3; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();
            }
        }

 

배열의 값을 입력받아 블러 처리

//입력 블러싱
        function insertBlurrImage(){

            if (inputSelectImage == 0)
                alert("사진을 선택해 주세요!");

            var maskSize = parseInt(prompt("블러싱할 값(홀 수)","3"));


            var mask = new Array(maskSize);
            for(var i =0; i<maskSize; i++)
                mask[i] = new Array(maskSize);

            for(var i=0; i<maskSize; i++)
                for(var k=0; k<maskSize; k++){
                    mask[i][k] = 1/(maskSize*maskSize);
                } 

            if (inputSelectImage == 1) {
                //입시 입력 배열
                tmpInputArray = new Array(inHeight + (maskSize-1)); // 
                for (var i = 0; i < inHeight + (maskSize-1); i++)
                    tmpInputArray[i] = new Array(inWidth + (maskSize-1));

                //임시 배열 초기화
                for (var i = 0; i < inHeight +(maskSize-1); i++)
                    for (var k = 0; k < inWidth + (maskSize-1); k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++)
                        tmpInputArray[i + ((maskSize-1)/2)][k + ((maskSize-1)/2)] = inImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(inHeight); // 2칸 큰 배열
                for (var i = 0; i < inHeight; i++)
                    tmpOutputArray[i] = new Array(inWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < inHeight; i++) {
                    for (var k = 0; k < inWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < maskSize; m++)
                            for (var n = 0; n < maskSize; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < inHeight; i++)
                    for (var k = 0; k < inWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        inImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutInImage();

            }
            else if (inputSelectImage == 2) {

                 //입시 입력 배열
                 tmpInputArray = new Array(secondHeight + (maskSize-1)); // 
                for (var i = 0; i < secondHeight + (maskSize-1); i++)
                    tmpInputArray[i] = new Array(secondWidth + (maskSize-1));

                //임시 배열 초기화
                for (var i = 0; i < secondHeight +(maskSize-1); i++)
                    for (var k = 0; k < secondWidth + (maskSize-1); k++)
                        tmpInputArray[i][k] = String.fromCharCode(127);

                //임시배열 --> 입시 입력
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++)
                        tmpInputArray[i + ((maskSize-1)/2)][k + ((maskSize-1)/2)] = secondImageArray[i][k];

                //임시 출력 배열
                tmpOutputArray = new Array(secondHeight); // 2칸 큰 배열
                for (var i = 0; i < secondHeight; i++)
                    tmpOutputArray[i] = new Array(secondWidth);

                // ***** 진짜 영상처리 알고리즘 *****
                for (var i = 0; i < secondHeight; i++) {
                    for (var k = 0; k < secondWidth; k++) {
                        var s = 0.0;
                        for (var m = 0; m < maskSize; m++)
                            for (var n = 0; n < maskSize; n++) {
                                s += mask[m][n] * tmpInputArray[i + m][k + n].charCodeAt(0);
                            }
                        tmpOutputArray[i][k] = s;
                    }
                }

                /*
                //만약, 마스크의 합계가 0이면, 결과를 127 더하자.
                for (var i = 0; i < outHeight; i++)
                for (var k = 0; k < outWidth; k++) {
                tmpOutputArray[i][k] += 127.0;
                }
                */
                //임시출력 --> 진짜 출력 배열
                for (var i = 0; i < secondHeight; i++)
                    for (var k = 0; k < secondWidth; k++) {
                        var v = tmpOutputArray[i][k];

                        if (v > 255) {
                            v = 255.0;
                        }
                        else if (v < 0) {
                            v = 0.0;
                        }
                        secondImageArray[i][k] = String.fromCharCode(v);
                    }

                printOutSecondImage();
            }
        }

 

728x90