Ảnh hình học biến đổi

Một phần của tài liệu biên dịch tài liệu hướng dẫn sử dụng bộ thư viện nguồn mở opencv (Trang 121)

2. Kinh nghiệ m:

2.2Ảnh hình học biến đổi

Các Hàm trong phần này thực hiện chuyển đổi hình học của hình ảnh 2D. Đó là, họ không thay

đổi nội dung hình ảnh, nhưng biến dạng lưới điểm ảnh, và bản đồ lưới này bị biến dạng. điểm

đến hình ảnh. Trong thực tế, để tránh các hiện vật lấy mẫu, lập bản đồđược thực hiện theo thứ

tự ngược lại, từđiểm đến nguồn. Đó là, mỗi điểm ảnh (x, y) của hình ảnh đích, Hàm tính toán tọa độ của điểm ảnh tương ứng "nhà tài trợ" trong hình ảnh nguồn và sao chép các điểm ảnh giá trị, đó là:

dst (x, y) = src (fx (x, y), fy (x, y))

Trong trường hợp khi người dùng xác định lập bản đồ về phía trước : , các OpenCV Hàm đầu tiên tính toán lập bản đồ tương ứng với nghịch đảo:

và sau đó sử dụng công thức trên.

Thực tế triển khai của biến đổi hình học, từ cvRemap chung nhất và cvResize đơn giản nhất và nhanh nhất, cần phải giải quyết 2 vấn đề chính với các bên trên công thức:

1. ngoại suy của các điểm ảnh không tồn tại. Tương tự như Hàm lọc, được mô tả trong vious phần, đối với một số (x, y) fx (x, y) hoặc fy (x, y), hoặc cả hai, có thể rơi bên ngoài hình ảnh, trong trường hợp một số phương pháp ngoại suy cần phải được sử dụng. OpenCV cung cấp

việc lựa chọn cùng một trong những phương pháp ngoại suy như trong các Hàm lọc, nhưng cũng là một quảng cáo ditional phương pháp BORDER_TRANSPARENT, có nghĩa là các

điểm ảnh tương ứng trong hình ảnh điểm đến sẽ không được sửa đổi tất cả.

2. suy của giá trị pixel. Thông thường fx (x, y) và fy (x, y) là sốđiểm nổi (tức là fx, fy có thể là một chuyển đổi afin hoặc quan điểm, hay biến dạng ống kính điều chỉnh bố trí hình tròn vv), do đó, một giá trị pixel tại tọa độ phân đoạn cần phải được lấy ra. Trong trường hợp đơn giản các tọa độ có thể được làm tròn đến tọa độ số nguyên gần nhất và tương ứng các điểm ảnh

được sử dụng, được gọi là gần nhất, hàng xóm nội suy. Tuy nhiên, một kết quả tốt hơn có thể

thểđạt được bằng cách sử dụng phương pháp nội suy phức tạp hơn, nơi mà một hàm đa thức là phù hợp với một số vùng lân cận của điểm ảnh tính (fx (x, y), fy (x, y)) và sau đó giá trị của đa thức (fx (x, y), fy (x, y)) được thực hiện như là giá trị điểm ảnh nội suy. Trong OpenCV bạn có thể lựa chọn giữa nhiều phương pháp nội suy, xem cvResize.

cvGetRotationMatrix2D Tính ma trận afin quay 2d. CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale, CvMat* mapMatrix );

center Trung tâm luân chuyển nguồn hình ảnh

angle Các góc quay ở các mức độ. Giá trị tích cực có nghĩa là quay ngược chiều kim đồng hồ

(coor- nguồn gốc dinate được giảđịnh là các góc trên cùng, bên trái) scale đẳng hướng quy mô yếu tố

mapMatrix Con trỏ trỏ tới các điểm đến 2 × 3 ma trận Cv2DRotationMatrix Hàm tính toán ma trận sau đây:

Với

α = scale . cos(angle), β = scale . sin(angle)

Việc chuyển đổi bản đồ các trung tâm luân chuyển đến chính nó. Nếu đây không phải là mục

đích, sự thay đổi được điều chỉnh. cvGetAffineTransform Tính affine biến đổi từ 3 điểm tương ứng. CvMat* cvGetAffineTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* mapMatrix );

dst Tọa độ của 3 đỉnh tam giác tương ứng với hình ảnh điểm đến mapMatrix Con trỏ trỏ tới các điểm đến 2 × 3 ma trận

CvGetAffineTransform Hàm tính toán ma trận của một affine biến đổi như vậy mà:

nơi

cvGetPerspectiveTransform

Tính quan điểm chuyển đổi từ 4 điểm tương ứng. CvMat* cvGetPerspectiveTransform(

const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* mapMatrix );

src Tọa độ 4 đỉnh tứ giác trong hình ảnh nguồn

dst Tọa độ 4 đỉnh tứ giác tương ứng với hình ảnh điểm đến mapMatrix Con trỏ trỏ tới các điểm đến 3 × 3 ma trận (adsbygoogle = window.adsbygoogle || []).push({});

CvGetPerspectiveTransform Hàm tính toán một ma trận của quan điểm biến đổi như vậy mà: nơi cvGetQuadrangleSubPix Lấy tứ giác điểm ảnh từ một hình ảnh với độ chính xác phân điểm ảnh. void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst,

const CvMat* mapMatrix ); src Nguồn hình ảnh

dst Trích tứ giác

mapMatrix Việc chuyển đổi 2 x 3 ma trận [A | b] (xem các cuộc thảo luận)

CvGetQuadrangleSubPix Hàm chiết xuất từ các điểm ảnh từ src độ chính xác sub-pixel và lưu trữ chúng dst như sau:

với

Các giá trị của pixel tại tọa độ số nguyên không được lấy ra bằng cách sử dụng nội suy song tuyến tính. Khi Hàm cần điểm ảnh bên ngoài của hình ảnh, nó sử dụng chếđộ biên giới nhân rộng để tái tạo lại giá trị. Mỗi kênh nhiều kênh hình ảnh được xử lý độc lập.

cvGetRectSubPix Lấy hình chữ nhật pixel từ một hình ảnh với độ chính xác sub-pixel. void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); src Nguồn hình ảnh dst Trích hình chữ nhật

center nổi tọa độ điểm của trung tâm hình chữ nhật được chiết xuất trong hình ảnh nguồn. Các trung tâm phải được bên trong hình ảnh

CvGetRectSubPix Hàm chiết xuất từ các điểm ảnh từ src: nơi mà các giá trị của các điểm ảnh tại tọa độ số nguyên không được lấy ra bằng cách sử dụng song tuyến tính interpo lation. Mỗi kênh nhiều kênh hình ảnh được xử lý độc lập. Trong khi hình chữ nhật trung tâm phải được bên trong hình ảnh, các bộ phận của hình chữ nhật có thể được bên ngoài. Trong trường hợp này, việc nhân rộng chế độ biên giới được sử dụng để có

được các giá trị điểm ảnh vượt ra ngoài ranh giới hình ảnh. cvLogPolar

Remaps một hình ảnh đểđăng nhập không gian cực. void cvLogPolar(

const CvArr* src, CvArr* dst,

CvPoint2D32f center, double M,

int flags=CV INTER LINEAR+CV WARP FILL OUTLIERS ); src Nguồn hình ảnh

dst Điểm đến hình ảnh

center Trung tâm chuyển đổi, nơi mà độ chính xác đầu ra là tối đa M Tầm quan trọng quy mô tham số. Xem dưới đây

flags Một sự kết hợp của phương pháp nội suy và những lá cờ tùy chọn sau đây:

CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến. Nếu một số trong số họ corre spond Bên ngoài trong các nguồn hình ảnh, họ thiết lập để không

CV_WARP_INVERSE_MAP Xem dưới đây

Chuyển tiếp chuyển đổi (CV_WARP_INVERSE_MAP không được thiết lập): Inverse chuyển đổi (CV_WARP_INVERSE_MAP được thiết lập):

nơi

Hàm giả lập tầm nhìn của con người "foveal" và có thể được sử dụng cho quy mô nhanh và quay bất biến mẫu phù hợp, để theo dõi đối tượng và vv. Các Hàm không thể hoạt động tại chỗ.

#include <cv.h> #include <highgui.h>

int main(int argc, char** argv) {

IplImage* src;

if( argc == 2 && (src=cvLoadImage(argv[1],1) != 0 ) {

IplImage* dst = cvCreateImage( cvSize(256,256), 8, 3 ); IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 );

cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS ); cvLogPolar( dst, src2, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP ); cvNamedWindow( "log-polar", 1 ); cvShowImage( "log-polar", dst );

cvNamedWindow( "inverse log-polar", 1 ); cvShowImage( "inverse log-polar", src2 ); cvWaitKey(); (adsbygoogle = window.adsbygoogle || []).push({});

}

return 0; }

cvRemap

Áp dụng một chuyển đổi hình học chung cho hình ảnh. void cvRemap(

const CvArr* src, CvArr* dst,

const CvArr* mapx, const CvArr* mapy,

int flags=CV INTER LINEAR+CV WARP FILL OUTLIERS, CvScalar fillval=cvScalarAll(0) );

src Nguồn hình ảnh dst Điểm đến hình ảnh

MapX Các bản đồ của x-tọa độ (CV_32FC1 hình ảnh) mapy bản đồ của y-tọa độ (CV_32FC1 hình ảnh)

flags Một sự kết hợp của phương pháp nội suy và cờ tùy chọn sau đây (s):

CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến. Nếu một số trong số họ correspond Bên ngoài trong các nguồn hình ảnh, họ thiết lập để fillval fillval Một giá trị sử dụng để điền Bên ngoài

CvRemap Hàm biến đổi hình ảnh nguồn bằng cách sử dụng bản đồ quy định: dst(x; y) = src(mapx(x; y), mapy(x; y))

Tương tự nhưđể biến đổi hình học khác, một số phương pháp nội suy (quy định bởi người sử

dụng) được sử dụng để trích xuất các pixel với các tọa độ số nguyên không. Lưu ý rằng các Hàm không thể hoạt động tại chỗ.

cvResize

Thay đổi kích thước hình ảnh. void cvResize(

CvArr* dst,

int interpolation=CV INTER LINEAR ); src Nguồn hình ảnh

dst Điểm đến hình ảnh

interpolation Phương pháp nội suy :

CV_INTER_NN gần nhất-neigbor nội suy

CV_INTER_LINEAR nội suy song tuyến tính (sử dụng mặc định)

CV_INTER_AREA lấy mẫu lại bằng cách sử dụng mối quan hệ khu vực điểm ảnh. Đây là phương pháp ưa thích cho im tuổi decimation cho kết quả không gợn sóng. Trong điều kiện của phóng to nó cũng tương tự như CV_INTER_NN phương pháp

CV_INTER_CUBIC bicubic suy

CvResize Hàm thay đổi kích thước một src hình ảnh để nó phù hợp với chính xác vào dst. Nếu ROI được thiết lập, Hàm xem xét tỷ lệ hoàn vốn như hỗ trợ.

cvWarpAffine

Áp dụng một chuyển đổi afin một hình ảnh. void cvWarpAffine(

const CvArr* src, CvArr* dst,

const CvMat* mapMatrix,

int flags=CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); (adsbygoogle = window.adsbygoogle || []).push({});

src Nguồn hình ảnh dst Điểm đến hình ảnh

mapMatrix 2 × 3 chuyển đổi ma trận

flags Một sự kết hợp của phương pháp nội suy và những lá cờ tùy chọn sau đây:

CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến, nếu một số người trong số họ correspond Bên ngoài trong các nguồn hình ảnh, họ thiết lập để fillval

CV_WARP_INVERSE_MAP cho thấy rằng ma trận nghịch chuyển đổi từ điểm đến hình ảnh nguồn, và do đó, có thể được sử dụng trực tiếp cho nội suy điểm ảnh. Nếu không, Hàm tìm thấy các biến đổi ngược từ mapMatrix

fillval Một giá trị sử dụng để điền Bên ngoài

CvWarpAffine Hàm biến đổi hình ảnh nguồn bằng cách sử dụng ma trận xác định: nơi

Hàm này tương tự như cvGetQuadrangleSubPix nhưng họ không chính xác như nhau. cvWarpAffine yêu cầu đầu vào và đầu ra hình ảnh có cùng một kiểu dữ liệu, có chi phí lớn hơn (do đó, nó không phải là khá phù hợp đối với hình ảnh nhỏ) và có thểđể lại một phần của hình

ảnh đích không thay đổi. Trong khi cvGetQuad rangleSubPix có thể trích xuất tứ từ 8-bit hình

ảnh vào bộđệm điểm nổi, đã nhỏ hơn trên đầu và luôn luôn thay đổi nội dung điểm đến toàn bộ hình ảnh. Lưu ý rằng Hàm có thể không hoạt động tại chỗ.

Để chuyển đổi một tập hợp thưa thớt điểm, sử dụng Hàm cvTransform từ cxcore. cvWarpPerspective

Áp dụng một biến đổi quan điểm cho một hình ảnh. void cvWarpPerspective(

const CvArr* src, CvArr* dst,

const CvMat* mapMatrix,

int flags=CV INTER LINEAR+CV WARP FILL OUTLIERS, CvScalar fillval=cvScalarAll(0) );

src Nguồn hình ảnh dst Điểm đến hình ảnh

mapMatrix 3 × 3 chuyển đổi ma trận

flags Một sự kết hợp của phương pháp nội suy và những lá cờ tùy chọn sau đây:

CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến, nếu một số người trong số họ correspond Bên ngoài trong các nguồn hình ảnh, họ thiết lập để fillval

CV_WARP_INVERSE_MAP cho thấy rằng ma trận nghịch chuyển đổi từ điểm đến hình ảnh nguồn, và do đó, có thể được sử dụng trực tiếp cho nội suy điểm ảnh. Nếu không, Hàm tìm thấy các biến đổi ngược từ mapMatrix

fillval Một giá trị sử dụng để điền Bên ngoài

CvWarpPerspective Hàm biến đổi hình ảnh nguồn bằng cách sử dụng ma trận xác định:

Lưu ý rằng các Hàm không thể hoạt động tại chỗ. Đối với một tập hợp thưa thớt của các điểm sử dụng cvPerspectiveTransform Hàm từ CxCore.

Một phần của tài liệu biên dịch tài liệu hướng dẫn sử dụng bộ thư viện nguồn mở opencv (Trang 121)