1. 程式人生 > >讀取影象資料的C實現(.raw儲存格式)

讀取影象資料的C實現(.raw儲存格式)

這是一篇關於均值濾波的文章,轉載過來參考其程式碼的讀取影象資料部分原文地址 http://www.cnblogs.com/qiqibaby/p/5277739.html// junzhilvbo.cpp : 定義控制檯應用程式的入口點。
//#include "stdafx.h"
#include "stdlib.h"
#include "string.h"#define DATA_X 256      //數字影象水平畫素個數
#define DATA_Y 256      //數字影象豎直畫素個數void OpenFile(const char *cFilePath , int nOriginalData[DATA_Y][DATA_X])
{
    printf("正在獲取資料......\n");
    FILE *fp ;
    fp = fopen(cFilePath , "r");
    if(NULL == fp)
    {
        printf("open file failed! \n");
        return ;
    }    unsigned char *pData = (unsigned char *)malloc(sizeof(unsigned char)*DATA_X*DATA_Y);
    if(NULL == pData)
    {
        printf("memory malloc failed!\n");
        return ;
    }    fread(pData , sizeof(unsigned char)*DATA_X*DATA_Y , 1 , fp);    int count_x = 0 ;
    int count_y = 0 ;    for(;count_y < DATA_Y ; count_y++)
    {
        for(; count_x < DATA_X ;count_x++)
        {
            nOriginalData[count_y][count_x] = pData[count_y*DATA_Y+count_x];
        }
    }    free(pData);
    fclose(fp);        return ;
}void SaveFile(const char *cFilePath , int nResultData[DATA_Y][DATA_X])
{
    printf("正在儲存資料......\n");
    int count_x,count_y;    FILE *fp ;
    fp = fopen(cFilePath , "w");
    if(NULL == fp)
    {
        printf("open file failed! \n");
        return ;
    }    for(count_y=0;count_y<DATA_Y;count_y++)
    {
        for(count_x=0;count_x<DATA_X;count_x++)         
        {
            fwrite(&nResultData[count_y][count_x],1,1,fp);
        }
    }
       
    fclose(fp);   
    printf("檔案儲存成功! \n");    return ;
}bool JunZhiLvBo(const int nOriginalData[DATA_Y][DATA_X], int nResultData[DATA_Y][DATA_X])
{
    printf("正在進行均值濾波......\n");
    int count_x ,count_y ;
   
    /*3*3模版濾波計算,不計算邊緣畫素*/
    for(count_y = 1 ; count_y < DATA_Y ; count_y++)
    {
        for(count_x = 1 ; count_x < DATA_X ;count_x++)
        {
            nResultData[count_y][count_x] = (int)((nOriginalData[count_y-1][count_x-1]+
                                                   nOriginalData[count_y-1][count_x]  +
                                                   nOriginalData[count_y-1][count_x+1]+
                                                   nOriginalData[count_y][count_x-1]  +
                                                   nOriginalData[count_y][count_x]    +
                                                   nOriginalData[count_y][count_x+1]  +
                                                   nOriginalData[count_y+1][count_x-1]+
                                                   nOriginalData[count_y+1][count_x]  +
                                                   nOriginalData[count_y+1][count_x+1])/9);
        }
    }    /*對四個邊緣直接進行賦值處理*/
    for(count_x=0;count_x<DATA_X;count_x++)                                        //水平邊緣畫素等於原來畫素灰度值
    {
        nResultData[0][count_x]=nOriginalData[0][count_x];
        nResultData[DATA_Y-1][count_x]=nOriginalData[DATA_Y-1][count_x];
    }
    for(count_y=1;count_y<DATA_Y-1;count_y++)                                     //豎直邊緣畫素等於原來畫素灰度值
    {
        nResultData[count_y][0]=nOriginalData[count_y][0];
        nResultData[count_y][DATA_X-1]=nOriginalData[count_y][DATA_X-1];
    }    return true ;
}int _tmain(int argc, _TCHAR* argv[])
{
    int nOriginalData[DATA_Y][DATA_X]; //儲存原始影象灰度值
    int nResultData[DATA_Y][DATA_X];   //儲存濾波後的灰度值    memset(nOriginalData,0,sizeof(nOriginalData));  //初始化陣列
    memset(nResultData,0,sizeof(nResultData));                                        char cOpenFilePath[] = "Lena.raw";                                           //影象檔案路徑    OpenFile(cOpenFilePath,nOriginalData);                         
   
    if(!JunZhiLvBo(nOriginalData,nResultData))                                   //濾波計算
    {
        printf("操作失敗!\n");
        return 0;
    }    char cSaveFilePath[] = "Result.raw";                                        //檔案儲存路徑    SaveFile(cSaveFilePath,nResultData);     return 0;
}