請問將圖片大小依30*40 pixels 切割N等分 |
尚未結案
|
shing.net
中階會員 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
|
auslk
初階會員 發表:35 回覆:77 積分:32 註冊:2003-02-17 發送簡訊給我 |
您好! 其實我也是想粉久,第一次寫影像處理程式 這程式目的在儲存相關位置的陣列 若有不妥之處,請各位多多協助小弟! 以下~ 注意事項: 請先拉出Image1 &Image2
Image2 必須先load 一張相同尺寸的空白影像 建議使用副程式 1.Image 輸入 轉陣列儲存
2.將陣列輸出到Image
// 主程式 void __fastcall TForm1::GRAY1Click(TObject * Sender) { int x =Image1->Width; int y =Image1->Height; int *f = new int[3 * x * y]; int *g = new int[3 * x * y]; image_to_array(Image1, f); // 讀取圖片至陣列 color_to_gray(x, y, f, g); //轉灰階 array_to_image(g, Image2); //輸出到圖片 Image2->Invalidate(); // 更新圖片 delete g; delete f; } //副程式 void image_to_array(TImage * Image1, int *f) { int x, y; int h = Image1->Picture->Height; int w = Image1->Picture->Width; Byte *ptr; for(y = 0; y < h; y ) { ptr = (Byte *) Image1->Picture->Bitmap->ScanLine[y]; // 取得圖片第 y // 軸的起始位置 for(x = 0; x < w * 3; x = x 3) { f[x 3 * w * y] = (int)ptr[x]; // 將圖片的pixel依序填入 陣列 f[x 1 3 * w * y] = (int)ptr[x 1]; f[x 2 3 * w * y] = (int)ptr[x 2]; } } } void array_to_image(int *g, TImage * Image2) { int x, y; Byte *ptr; int h = Image2->Picture->Height; int w = Image2->Picture->Width; /* Graphics::TBitmap * bmp = new Graphics::TBitmap(); bmp->Assign(Image1->Picture->Bitmap); bmp->PixelFormat = pf24bit; */ for(y = 0; y < h; y ) { ptr = (Byte *) Image2->Picture->Bitmap->ScanLine[y]; // 取得圖片第 y // 軸的起始位置 for(x = 0; x < w * 3; x = x 3) { ptr[x 2] = (Byte) g[x 3 * w * y]; // 將陣列的pixel依序填入圖片 ptr[x 1] = (Byte) g[(x 1) 3 * w * y]; ptr[x] = (Byte) g[(x 2) 3 * w * y]; } } } 320*240 舉例: 定義第一塊區塊: for(j=0;j<160;j ) for(i=0;i<120;i ) 定義第二塊區塊: for(j=160;j<=320;j ) for(i=0;i<120;i ) 定義第三塊區塊: for(j=0;j<160;j ) for(i=120;i<240;i ) 定義第四塊區塊: for(j=160;j<320;j ) for(i=120;i<240;i ) |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 請問將圖片大小依30*40 pixels 切割N等分 且每一等分之後還要讀出pixel作處理,但不需存檔 之較佳寫法你好: 如果只是要分塊讀取圖資料做處理,且不做存檔動作 個人的經驗是不需要真的把圖片切割,只要讀取時, 迴圈寫得正確,應該不會有太大的困難。以下是一個小範例 [運動估測,全域搜尋] void fullsearchE(int** mvx, int** mvy, byte** R, byte** C, int imgw, int imgh, int blksize, //處理的區塊大小; int range) { int i,j,x,y; int a,b,l,m; double minmse,mse; int width,height; byte **cb,**rb; byte **ref; //------reference with Extend----------------- cb=GiveImageMemory(blksize,blksize); rb=GiveImageMemory(blksize,blksize); ref=ImageExtend(R,imgw,imgh,range); //extend ( -)7 or 15; width =(int)imgw/blksize; height=(int)imgh/blksize; for(j=0,y=0;j |
roger-c
一般會員 發表:7 回覆:14 積分:4 註冊:2003-11-20 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 不好意思想請問jerrykuo大大,就是關於roger-c你好: 先說聲抱歉,小弟的本意只是給個分塊處理的範例,所以有一些小細節,並未多加 說明。 C矩陣是一張二維陣列影像,在運動估測裡稱為current frame,那段程式的目的 是抓取一個blocksize*blocksize大小的區塊,其位置在frame[y][x]。 R矩陣也是一張二維陣列影像,在運動估測裡稱為reference frame,而ref矩陣 是R矩陣向外擴張(Padding)後的影像,擴張範圍為range,那段程式的目的是抓取 ref Frame一個同cb大小的區塊,不考慮padding的range,所以同一個位置的區塊 就加上range。 整個函數的目的為:求得每個區塊的運動向量,range為搜尋範圍,blocksize為區 塊大小。for(j=0,y=0;j |
roger-c
一般會員 發表:7 回覆:14 積分:4 註冊:2003-11-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |