본문 바로가기

OpenCV없는 영상처리

히스토그램 처리

시연 영상(유튜브) : https://youtu.be/FBeLOG2fROM

 

<원본 이미지 스트레칭 처리하기>

알고리즘
결과화면

function stretchImage(){
                outH=inH;
                outW=inW;

                outImage = new Array(outH);
                for(let i=0;i<outH;i++)
                    outImage[i] = new Array(outW);
                //공식 out= (in-LOW)/(HIGH-LOW)*255.0
                let LOW = inImage[0][0],HIGH=inImage[0][0];
                for(let i=0;i<inH;i++)
                    for(let k=0;k<inW;k++){
                        if(LOW>inImage[i][k])
                            LOW = inImage[i][k];
                        if(HIGH<inImage[i][k])
                            HIGH = inImage[i][k];
                    }
                for(let i=0;i<inH;i++){
                    for(let k=0;k<inW;k++){
                        let out = (inImage[i][k]-LOW)/(HIGH-LOW)*255.0;
                        if(out<0.0)
                            out =0;
                        else if(out>255.0)
                            out = 255;
                        else
                            out = parseInt(out);
                        outImage[i][k] = out;
                    }
                }
                displayImage();
           }

 

 

 

<원본 이미지 엔드인 처리하기>

알고리즘

 

결과화면

function endInImage(){//엔드-인 탐색 알고리즘
                //(중요!) 출력이미지의 크기가 결정--> 알고리즘에 의존
                outH=inH;
                outW=inW;
                //출력 영상의 2차원 메모리 할당
                outImage = new Array(outH);
                for (let i = 0; i < outH; i++)
                    outImage[i] = new Array(outW);
                //***진짜 영상처리 알고리즘 ***
                //공식 out =(in-LOW)/(HIGH-LOW)*255.0
                let LOW = inImage[0][0], HIGH=inImage[0][0];
                for(let i=0;i<inH;i++)
                    for(let k=0;k<inW;k++){
                        if(LOW>inImage[i][k])
                            LOW = inImage[i][k];
                        if(HIGH < inImage[i][k])
                            HIGH = inImage[i][k];
                    }
                LOW+=50;
                HIGH-=50;

                for(let i=0;i<inH;i++){
                    for(let k=0;k<inW;k++){
                        let out = (inImage[i][k]-LOW)/(HIGH-LOW)*255.0;
                        if(out <0.0)
                            out =0;
                        else if(out>255.0)
                            out =255;
                        else
                            out = parseInt(out);
                        outImage[i][k] = out;
                    }
                }
                //***********************
                displayImage();
            }

 

 

 

<원본 이미지 평활화 처리하기>

알고리즘
결과화면

 

function equalizeImage(){//히스토그램 평활화 알고리즘
                //(중요!) 출력이미지의 크기가 결정--> 알고리즘에 의존
                outH=inH;
                outW=inW;
                //출력 영상의 2차원 메모리 할당
                outImage = new Array(outH);
                    for (let i = 0; i < outH; i++)
                        outImage[i] = new Array(outW);
                //***진짜 영상처리 알고리즘 ***
                //1단계 : 히스토그램 생성
                let histo = new Array(256);
                //초기화
                for(let i=0;i<256;i++)
                    histo[i]=0;
                //카운트
                for(let i=0;i<inH;i++)
                    for(let k=0;k<inW;k++)
                        histo[inImage[i][k]]++;
                
                //2단계 : 누적히스토그램 생성
                let sumHisto = new Array(256);
                //초기화
                for(let i=0;i<256;i++)
                    sumHisto[i]=0;
                //계산
                let sumValue =0;
                for(let i=0;i<256;i++){
                    sumValue +=histo[i];
                    sumHisto[i] = sumValue;
                }

                //3단계 : 정규화된 누적 히스토그램 생성
                //공식: normal = sum*(1/(inH*inW))*255
                let normalHisto = new Array(256);
                //초기화
                for(let i=0;i<256;i++)
                    normalHisto[i]=0.0;
                //계산
                for(let i=0;i<256;i++){
                    let normal = sumHisto[i]*(1.0/(inH*inW))*255.0;
                    normalHisto[i]=normal;
                }
                for(let i=0;i<inH;i++){
                    for(let k=0;k<inW;k++){
                        outImage[i][k] = parseInt(normalHisto[inImage[i][k]]);
                    }
                }
                //***********************
                displayImage();
            }

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

영상처리의 전처리부  (0) 2022.09.12
화소영역처리  (0) 2022.09.11
기하학처리  (0) 2022.09.11
화소 점 처리  (0) 2022.09.11
인공지능과 영상처리  (0) 2022.09.11