圖像處理之裁剪(Resize)
阿新 • • 發佈:2018-03-22
tro 源碼實現 角點 res main 利用 highgui wim return
1 圖像裁剪
在實際工作中,經常需要根據研究工作要求對圖像進行裁剪(Subset Image),按照實際圖像分幅裁剪的過程,可以將圖像分幅裁剪分為兩種類型:規則分幅裁剪(Rectangle Subset),不規則分幅裁剪(Pdygon Subset)。
規則分幅裁剪:裁剪圖像的邊界範圍是一個矩形,通過左上角和右下角兩點的坐標,就可以確定圖像的裁剪位置,整個裁剪過程比較簡單。
不規則分幅裁剪:裁剪圖像的邊界範圍是任意多邊形,無法通過左上角和右下角兩點的坐標確定裁減位置,而必須事先生成一個完整的閉合多邊形區域,可以是一個AOI多邊形,也可以是ArcInfo的一個Polygon Coverage,針對不同的情況采用不同的裁剪過程。
2 源碼實現(C語言)
由於不規則分幅裁剪比較復雜,在常規圖像處理中並不常見,因此我們通常進行的是規則分幅裁剪,如下是利用C實現的圖像規則裁剪,源碼如下:
1 #include "stdafx.h" 2 #include "cv.h" 3 #include "highgui.h" 4 5 int myCutOut(IplImage* src, IplImage* dst, int x, int y, int w, int h) 6 { 7 //x,y為矩形框左上角點坐標,w為寬度,h為高度8 int width_src = src->widthStep; 9 int height_src = src->height; 10 byte* gray_src = (byte*)src -> imageData; 11 12 int width_dst = dst ->widthStep; 13 int height_dst = dst ->height; 14 byte* gray_dst = (byte*)dst -> imageData; 15 16 for (int i = 0; i < height_dst; i++) 17 { 18 for (int j = 0; j < width_dst; j++) 19 { 20 gray_dst[i * width_dst + j] = gray_src[(y + i) * width_src + x + j]; 21 } 22 } 23 24 return 0; 25 } 26 27 int _tmain(int argc, _TCHAR* argv[]) 28 { 29 IplImage* Img_src = cvLoadImage("lena.bmp", -1); 30 //目標大小為150x50 31 IplImage* Img_dst = cvCreateImage(cvSize(150,50),IPL_DEPTH_8U,Img_src->nChannels); 32 //起始點坐標為(250,250) 33 myCutOut(Img_src, Img_dst, 250, 250, Img_dst -> width, Img_dst -> height); 34 35 cvShowImage("src", Img_src); 36 cvShowImage("cutout", Img_dst); 37 cvWaitKey(0); 38 39 return 0; 40 }
仿真效果圖如下:
輸入圖片:
輸出圖片:
圖像處理之裁剪(Resize)