標籤

二元樹 (1) 字串常數池 (1) 投資 (3) 每月損益 (37) 例外處理 (1) 泛型 (2) 股票 (15) 指標 (5) 英文 (8) 基本資料型別 (1) 期貨 (1) 程式交易 (10) 量化投資 (5) 亂亂寫 (3) 概念 (3) 資料結構 (3) 演算法 (3) 數學 (3) 轉型 (1) AMA (1) ArrayList (1) assert (1) BeautifulSoup (1) C/C++ (8) casting (1) ClassCastException (1) classpath (1) Collection (4) Comparable (1) comparTo() (1) constructor (1) database (3) Debian (1) Dropbox (2) EA (2) enum (1) equals() (2) exception (3) extends (1) ffmpeg (1) final (1) Git (1) HashMap (1) HashSet (1) hasNext() (1) HTS (3) instanceof (1) IS-A (1) Iterator (1) JAVA (43) length (1) Linux (31) List (1) Mac (6) Map (1) ML (2) MT4 (6) MySQL (2) next() (1) NullPointerException (1) Number (1) Numpy (2) OpenCart (1) OpenCV (3) OSX (1) overloading (1) overriding (3) pandas (2) PHP (8) PriorityQueue (1) Python (11) Queue (1) random() (1) reverse() (1) Samba (1) SCJP (21) sqrt() (1) synchronized (1) talib (1) ufw (1) uTorrent (1) var-args (2) VHF (1) vim (2) Yhoo知識+ (4)

2011年11月26日 星期六

111113_利用C為點陣圖做自動對比

#include <stdio.h>
#include <stdlib.h>

#define write_path "output.bmp" //輸出圖檔的檔名

void GCS(const char*, const char*); //global contrast stretching(全域對比調整)

int main(void)
{
    char select[10];
    char exit[5] = "exit";

    while(1){
        printf("請輸入圖片檔名(包含副檔名,例: input.bmp),輸入exit為結束: ");
        scanf("%s", &select);
        if(strcmp(select, exit) == 0){
            printf("程式結束!\n") ;
            system("PAUSE");
            return 0;
        }
     GCS(select, write_path);  
    }
   return 0;
}

void GCS(const char *input, const char *output){
unsigned char bmp_head[54]={0};  //存放bmp的標頭檔
    unsigned char *data_buf;      //BMP的資料
    unsigned int i,j;              
    unsigned int width=0, high=0;      //BMP圖檔的寬與高
    unsigned int bmp_w;              //BMP資料陣列每一列長度
int max=0, min=255;
char exit[] = "exit";

    FILE *fp1;  //輸入檔
    FILE *fp2;  //輸出檔

    fp1 = fopen(input, "rb" ); //讀取二進位圖檔並寫入
    fp2 = fopen(output, "w+b" ); //新建二進位檔並讀取寫入

    if(fp1 == NULL){
        printf("檔案找不到!\n");
        return;
    }

    fread(bmp_head,54,1,fp1);        //讀取來源標頭檔
    fwrite(bmp_head,54,1,fp2);        //寫入標頭檔至fp2

//從標頭檔讀出BMP圖檔寬度及高度 (單位:像素)
    width = *(bmp_head+18) + 256*(*(bmp_head+19)) + 256*256*(*(bmp_head+20)) + 256*256*256*(*(bmp_head+21));          
    high  = *(bmp_head+22) + 256*(*(bmp_head+23)) + 256*256*(*(bmp_head+24)) + 256*256*256*(*(bmp_head+25));

printf("%d\n", *(bmp_head+28));
printf("%d %d %d %d\n", *(bmp_head+18),*(bmp_head+19),*(bmp_head+20),*(bmp_head+21));
printf("%d %d %d %d\n", *(bmp_head+22),*(bmp_head+23),*(bmp_head+24),*(bmp_head+25));
printf("%d %d\n", width,high);

    //BMP資料陣列每一列長度為:
    //像素寬度X顏色深度,即width*3(以24bits的BMP為例)
    bmp_w=width*3;
    //每一列長度須為4的倍數,所以要加上4-(width*3)%4
    if(bmp_w % 4)    bmp_w += 4-(bmp_w % 4);

    //跟系統要BMP資料陣列一列長度的記憶體
    data_buf = (unsigned char *) malloc(sizeof(unsigned char)*bmp_w);      

   for(i=0; i<high; i++){
        fread(data_buf, bmp_w, 1, fp1);   //每次從fp1讀取一列BMP陣列至data_buf
        for(j=0; j<width; j++){
          if(data_buf[j] > max) max = data_buf[j];        
            if(data_buf[j] < min) min = data_buf[j];
        }  
   }
   fp1 = fopen(input, "r+b");
   fread(bmp_head,54,1,fp1);

   for(i=0; i<high; i++){
        fread(data_buf, bmp_w, 1, fp1);   //每次從fp1讀取一列BMP陣列至data_buf          
for(j=0; j<width*3; j+=3){
          data_buf[j]  = 255*(data_buf[j+2]-min)/(max-min);
            data_buf[j+1]  = 255*(data_buf[j+1]-min)/(max-min);
            data_buf[j+2]  = 255*(data_buf[j]-min)/(max-min);
        }
        fwrite(data_buf,bmp_w,1,fp2); //將data_buf存入fp2檔  
   }

   fclose(fp1);
   fclose(fp2);
printf("Local contrast stretching處理完成!\n請開啟檔案 "write_path"\n\n");
}