동일영상
public void equalImage(){
outH=inH;
outW=inW;
outImage= new int[3][outH][outW];
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
outImage[rgb][i][k]=inImage[rgb][i][k];
}
}
}
}
반전영상
public void reverseImage(){
//반전영상
//중요! 출력영상의 크기 결정 알고리즘에 의존
outH = inH;
outW = inW;
outImage = new int[3][outH][outW];
//**Image Processing Algorithm**
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
outImage[rgb][i][k]= 255-inImage[rgb][i][k];
}
}
}
}
밝게/어둡게
public void addImage(){
//Add Image 영상
//중요! 출력 영상의 크기 결정(알고리즘에 의존)
outH=inH;
outW=inW;
outImage=new int[3][outH][outW];
//**Image Processing Algorithm **
int value = Integer.parseInt(para1);
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
if(inImage[rgb][i][k]+value>255)
outImage[rgb][i][k]=255;
else if(inImage[rgb][i][k]+value<0)
outImage[rgb][i][k]=0;
else
outImage[rgb][i][k]=inImage[rgb][i][k]+value;
}
}
}
}
영상 곱하기
public void gopImage(){
//gop Image 영상
//중요! 출력 영상의 크기 결정(알고리즘에 의존)
outH=inH;
outW=inW;
outImage=new int[3][outH][outW];
//**Image Processing Algorithm **
int value = Integer.parseInt(para1);
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
if(inImage[rgb][i][k]*value>255)
outImage[rgb][i][k]=255;
else if(inImage[rgb][i][k]*value<0)
outImage[rgb][i][k]=0;
else
outImage[rgb][i][k]=inImage[rgb][i][k]*value;
}
}
}
}
영상 나누기
public void divImage(){
//gop Image 영상
//중요! 출력 영상의 크기 결정(알고리즘에 의존)
outH=inH;
outW=inW;
outImage=new int[3][outH][outW];
//**Image Processing Algorithm **
int value = Integer.parseInt(para1);
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
if(inImage[rgb][i][k]/value>255)
outImage[rgb][i][k]=255;
else if(inImage[rgb][i][k]/value<0)
outImage[rgb][i][k]=0;
else
outImage[rgb][i][k]=inImage[rgb][i][k]/value;
}
}
}
}
흑백 127
public void image127(){
//흑백 127기준변환
outH = inH;
outW = inW;
outImage = new int[3][outH][outW];
//** Image Processing Algorithm **
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
int sumValue = inImage[0][i][k]+inImage[1][i][k]+inImage[2][i][k];
int avgValue = sumValue/3;
if(avgValue>127){
outImage[0][i][k]=255;
outImage[1][i][k]=255;
outImage[2][i][k]=255;
}
else{
outImage[0][i][k]=0;
outImage[1][i][k]=0;
outImage[2][i][k]=0;
}
}
}
}
흑백평균
public void avgImage(){
//흑백 평균기준변환
outH = inH;
outW = inW;
outImage = new int[3][outH][outW];
int hap=0,avg,cnt=0;
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
hap+=inImage[rgb][i][k];
cnt++;
}
}
}
avg = hap/cnt;
//** Image Processing Algorithm **
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
int sumValue = inImage[0][i][k]+inImage[1][i][k]+inImage[2][i][k];
int avgValue = sumValue/3;
if(avgValue>avg){
outImage[0][i][k]=255;
outImage[1][i][k]=255;
outImage[2][i][k]=255;
}
else{
outImage[0][i][k]=0;
outImage[1][i][k]=0;
outImage[2][i][k]=0;
}
}
}
}
파라볼라 컵
public void paraCupImage(){
outH=inH;
outW=inW;
outImage = new int[3][outH][outW];
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<outH;i++){
for(int k=0;k<outW;k++){
outImage[rgb][i][k]=(int)(Math.pow((double)(inImage[rgb][i][k]/128-1),(double)2)*255);
}
}
}
}
파라볼라 캡
public void paraCapImage(){
outH=inH;
outW=inW;
outImage = new int[3][outH][outW];
for(int rgb=0;rgb<3;rgb++){
for(int i=0;i<outH;i++){
for(int k=0;k<outW;k++){
outImage[rgb][i][k]=(int)(255-(255)*Math.pow((double)(inImage[rgb][i][k]/128-1),(double)2));
}
}
}
}
감마
public void gammaImage(){
//감마
outH =inH;
outW =inW;
// 메모리 할당
outImage = new int[3][outH][outW];
/// ** Image Processing Algorithm **
double value = Double.parseDouble(para1);
if(value <0)
value =1/(1-value);
else
value +=1;
//감마 변환
for(int rgb=0;rgb<3;rgb++){
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double result=(Math.pow((double)(inImage[rgb][i][k]/255.0),(double)(value))*255+0.5);
if(result <0)
result=0;
else if(result >255)
result=255;
outImage[rgb][i][k] = (int)result;
}
}
}
}
채도변환
public void saturImage() { // 채도 변경 알고리즘
// (중요!) 출력 이미지의 크기가 결정 ---> 알고리즘에 의존...
outH = inH;
outW = inW;
// 출력 영상의 3차원 메모리 할당
outImage = new int[3][inH][inW];
// **** 진짜 영상처리 알고리즘 *****
float s_value = Float.parseFloat(para1);
for (int i=0; i<inH; i++) {
for (int k=0; k<inW; k++) {
float R = inImage[0][i][k];
float G = inImage[1][i][k];
float B = inImage[2][i][k];
// RGB --> HSV
//rgb2hsv(R,G,B); // {h : 0~360, s : 0 ~ 1.0, v : 0 ~ 1.0}
// int HSV[];
//System.out.println("R"+R);
abc = rgb2hsv(R,G,B);
float H = abc[0];
float S = abc[1];
float V = abc[2];
// 채도를 변경하자
S = S + s_value;
// HSV --> RGB
def = hsv2rgb(H,S,V);
int R1 = (int) def[0];
int G1 = (int) def[1];
int B1 = (int) def[2];
// 출력 영상에 넣기
outImage[0][i][k] = R1;
outImage[1][i][k] = G1;
outImage[2][i][k] = B1;
}
}
// ******************************
}
그레이스케일
public void grayImage(){
outH=inH;
outW=inW;
outImage = new int[3][outH][outW];
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
int sumValue = inImage[0][i][k]+inImage[1][i][k]+inImage[2][i][k];
int avgValue = sumValue/3;
outImage[0][i][k]=avgValue;
outImage[1][i][k]=avgValue;
outImage[2][i][k]=avgValue;
}
}
}
명도변환
public void intensityImage() { // 명도 변경 알고리즘
// (중요!) 출력 이미지의 크기가 결정 ---> 알고리즘에 의존...
outH = inH;
outW = inW;
// 출력 영상의 3차원 메모리 할당
outImage = new int[3][inH][inW];
// **** 진짜 영상처리 알고리즘 *****
float v_value = Float.parseFloat(para1);
for (int i=0; i<inH; i++) {
for (int k=0; k<inW; k++) {
float R = inImage[0][i][k];
float G = inImage[1][i][k];
float B = inImage[2][i][k];
// RGB --> HSV
//rgb2hsv(R,G,B); // {h : 0~360, s : 0 ~ 1.0, v : 0 ~ 1.0}
// int HSV[];
//System.out.println("R"+R);
abc = rgb2hsv(R,G,B);
float H = abc[0];
float S = abc[1];
float V = abc[2];
// 채도를 변경하자
V = V + v_value;
// HSV --> RGB
def = hsv2rgb(H,S,V);
int R1 = (int) def[0];
int G1 = (int) def[1];
int B1 = (int) def[2];
// 출력 영상에 넣기
outImage[0][i][k] = R1;
outImage[1][i][k] = G1;
outImage[2][i][k] = B1;
}
}
// ******************************
}
오렌지추출
public void orangeImage(){
outH=inH;
outW=inW;
outImage= new int[3][outH][outW];
for(int i=0;i<inH;i++){
for(int k=0;k<inW;k++){
int R = inImage[0][i][k];
int G = inImage[1][i][k];
int B = inImage[2][i][k];
hsv = rgb2hsv(R,G,B);
float H = hsv[0];
float S = hsv[1];
float v = hsv[2];
if(8<=(H*360)&&(H*360)<=30){
outImage[0][i][k]=R;
outImage[1][i][k]=G;
outImage[2][i][k]=B;
}
else{
int avg =(R+G+B)/3;
outImage[0][i][k]=avg;
outImage[1][i][k]=avg;
outImage[2][i][k]=avg;
}
}
}
}
'JSP환경에서 OpenCV없는 컬러영상처리' 카테고리의 다른 글
화소영역처리 (0) | 2022.09.29 |
---|---|
기하학처리 (0) | 2022.09.29 |
JSP에서 이미지 받아오기 (0) | 2022.09.29 |
JSP클라이언트 코드 (0) | 2022.09.29 |
가상윈도우에서 이클립스를 통해 서버환경 구축하기 (0) | 2022.09.27 |