Nghiên cứu giải thuật siêu phân giải ảnh ứng dụng trên Kit Arm

89 42 0
Nghiên cứu giải thuật siêu phân giải ảnh ứng dụng trên Kit Arm

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Tóm tắt: Luận văn này tập trung nghiên cứu giải thuật siêu phân giải ảnh nhằm cải thiện chất lượng ảnh thu thập dược từ kính lúp điện tử nhằm phục vụ cho các ứng dụng soi chiêu dùng trong y tế. Giải thuật được phát triển dựa trên quá trình imageregistration từ một chuỗi các frame ảnh chất lượng thấp ngõ vào. Dựa vào chuyển động tương đối giữa các frame ảnh được chụp liên tiếp, giải thuật sẽ phân tích, sắp xếp và nội suy các điểm ảnh để tạo ra ảnh chất lượng cao ngõ ra. Giải thuật siêu phân giải đáp ứng được các yêu cầu: Có thể cài đặt lên các hệ thống nhúng Hỗ trợ siêu phân giải cho ảnh màu

CƠNG TRÌNH ĐƯỢC HỒN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA -ĐHQG -HCM Cán hướng dẫn khoa học : TS Trương Quang Vinh Cán chấm nhận xét : GS TS Lê Tiến Thường Cán chấm nhận xét : TS Bùi Trọng Tú Luận văn thạc sĩ bảo vệ Trường Đại học Bách Khoa, ĐHQG Tp HCM ngày 05 tháng 01 năm 2017 Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm: TS Lê Chí Thơng TS Trương Công Dung Nghi GS TS Lê Tiến Thường TS Bùi Trọng Tú TS Nguyễn Minh Sơn Xác nhận Chủ tịch Hội đồng đánh giá LV Trưởng Khoa quản lý chuyên ngành sau luận văn sửa chữa (nếu có) CHỦ TỊCH HỘI ĐỒNG TRƯỞNG KHOA ĐẠI HỌC QUỐC GIA TP.HCM CỘNG HÒA XÃ HỘI CHI NGHĨA VIỆT NAM TRƯỜNG ĐẠI HỌC BÁCH KHOA Độc lập - Tự - Hạnh phúc NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: Nguyễn Thế Man MSHV:7140382 Ngày, tháng, năm sinh: 25/12/1990 Nơi sinh: Đà Nẵng Chuyên ngành: Kỹ thuật Điện tử Mã số : 60.52.02.03 I TÊN ĐỀ TÀI: Thiết kế IP nhận dạng chuyển động video II NHIỆM VỤ VÀ NỘI DUNG: Luận văn tập trung nghiên cứu giải thuật siêu phân giải ảnh dựa chuỗi frame ảnh chất lương thấp ngõ vào, có khả ứng dụng lên hệ thống nhúng nhằm phục vụ cho ứng dụng soi chiếu dùng y tế III NGÀY GIAO NHIỆM VỤ : (Ghi theo QĐ giao đề tài) 15/08/2016 IV NGÀY HOÀN THÀNH NHIỆM VỤ: (Ghi theo QĐ giao đề tài) 04/12/2016 V CÁN BỘ HƯỚNG DẪN (Ghi rõ học hàm, học vị, họ, tên): TS Trương Quang Vinh Tp HCM, ngày thảng năm 2016 CÁN BỘ HƯỚNG DẪN CHỦ NHIỆM BỘ MÔN ĐÀO TẠO (Họ tên chữ ký) (Họ tên chữ ký) TRƯỞNG KHOA (Họ tên chữ ký) LỜI CẢM ƠN Trong suất trình học tập, thực hoàn thành luận văn này, em nhận hướng dẫn, giúp đỡ quý báu thầy cô, anh chị, em bạn Với lòng kính trọng biết ơn sâu sắc em xỉn bày tỏ lời cảm ơn chân thành tới: TS Trương Quang Vinh, người thầy kính mến hết lòng giúp đỡ, dạy bảo, động viên tạo điều kiện thuận lợi cho em suất trình thực luận văn tốt nghiệp Thầy người định hướng, góp ỷ dạy phương pháp làm việc, giúp em hồn thành luận văn cách tổt Các quý thầy cô khoa Điện — Điện tử, trường Đại Học Bách Khoa thành phổ Hồ Chí Minh tận tình chi dạy truyền đạt kiến thức giúp em đạt kết ngày hôm Bên cạnh đó, em xin chân thành cảm ơn bổ mẹ gia đình ln hỗ trợ, động viên mặt vật chất tinh thần, giúp em hoàn thành tốt luận văn TÓM TẮT LUẬN VĂN Luận văn tập trung nghiên cứu giải thuật siêu phân giải ảnh nhằm cải thiện chất lượng ảnh thu thập dược từ kính lúp điện tử nhằm phục vụ cho ứng dụng soi chiêu dùng y tế Giải thuật phát triển dựa trình imageregistration từ chuỗi frame ảnh chất lượng thấp ngõ vào Dựa vào chuyển động tương đối frame ảnh chụp liên tiếp, giải thuật phân tích, xếp nội suy điểm ảnh để tạo ảnh chất lượng cao ngõ Giải thuật siêu phân giải đáp ứng yêu cầu: - Có thể cài đặt lên hệ thống nhúng - Hỗ trợ siêu phân giải cho ảnh màu ABSTRACT This thesis focuses on image super-resolution algorithm to enhance the quality of image obtained from a Digital Microscope to apply to medical application The proposed algorithm based on the image-registration for a sequence of low-resolution input image Based on relative motion between image input, the super-resolution algorithm will analysis, arrange and interpolate image pixel to create higher resolution image The super-resolution algorithm must meet the following requirements: - Can be install on the embeded systems - Support color images LỜI CAM ĐOAN Học viên cam đoan rằng, ngoại trừ kết tham khảo từ cơng trình khác ghi rõ bảo cảo đề tài, cơng việc trình bày báo cáo học viên thực MỤC LỤC NHIỆM VỤ LUẬN VÀN THẠC sĩ iv CÁN BỘ HƯỚNG DẪN iv CHỦ NHIỆM BỘ MÔN ĐÀO TẠO iv TRƯỞNG KHOA iv CHƯƠNG TÔNG QUAN ĐỀ TÀI 1.1 MỞ ĐẦU 1.1.1 Bối cảnh hình thành đề tài 1.1.2 Tính cấp thiết 1.1.3 Mục tiêu đề tài CHƯƠNG NGHIÊN CỨU TỔNG QUAN GIẢI THUẬT SIÊU PHÂN GIẢI ẢNH VÀ MẠNG NEURAL NHÂN TẠO 2.1 TÔNG QUAN NỘI DUNG NGHIÊN CỨU 2.1.1 Cách tiếp cận phương pháp nghiên cứu .5 2.1.2 Tổng quan siêu phân giải ảnh số 2.1.3 Các phương pháp siêu phân giải từ ảnh ngõ vào 2.1.4 Các giải pháp siêu phân giải từ thông tin chuỗi frame ảnh ngõ vào 20 2.2 TÔNG QUAN VỀ MẠNG NEURAL 27 2.2.1 Khái niệm mạng neural 27 2.2.2 Huấn luyện mạng 29 CHƯƠNG NGHIÊN CỨU GIẢI THUẬT SIÊU PHÂN GIẢI ẢNH 32 3.1 Image registration 33 3.1.1 Ước lượng chuyển động xoay 34 3.1.2 Ước lượng chuyển động dịch .37 3.2 Nội suy dựa mạng neural 37 3.3 Siêu phân giải cho ảnh màu 40 3.4 Tối ưu giải thuật 42 3.5 Kiểm chứng giải thuật 43 CHƯƠNG ĐẶC TẢ THIẾT KẾ THIẾT BỊ SIÊU PHÂN GIẢI ẢNH DÙNG TRONG Y TẾ 45 4.1 Tính sản phẩm 45 4.2 Đặc tả phần cứng 45 4.2.1 Sơ đồ tổng quát 45 4.2.2 Các module phần cứng hệ thống 46 4.3 Đặc tả phàn mềm 47 4.3.1 Lưu đồ thuật toán 47 4.3.2 Tổ chức chương trình 49 4.3.3 Huấn luyện mạng neural 50 4.3.4 Giao diện chương trình 51 CHƯƠNG KẾT LUẬN 54 5.1 So sánh kết thiết kế so với yêu cầu đề tài 54 5.2 giải thuật siêu phân giải ảnh 54 5.3 sản phẩm demo 55 5.4 báo khoa học 55 PHỤ LỤC A: XÂY DỤNG TẬP ẢNH MẪU 56 PHỤ LỤC B: MÃ NGUỒN CỦA TỒN BỘ CHƯƠNG TRÌNH 59 TÀI LIỆU THAM KHẢO 74 static const uỉnt N = 8; public: ImageSuperResolution0; cv::Mat shift estimation lev::Mat* im sre in, uint numLrln); cv::Mat imageSRlev::Mat* lrims, cv::Mat deltaest, int numLrln, int zoomFactor); private: uint numthreads; NeuralNet *net; cv: :Mat get_complexlev::Mat complexMat, complex_mode_type mode); cv::Mat fftshiftlev;:Mat I); cv::Mat complexdivisonlev::Mat complexA, cv::Mat complexB); cv::Mat shift estimation proc (const cv::Mat hann, const cv::Mat Sref, cv::Mat *im_src_in, uint numLrln); int interpolation image lev::Mat &img, const cv::Mat pixels idx); void meanfilterat(int X, int y, cv::Mat& img); d image superresolution.cpp using namespace std; ImageSuperResolution::ImageSuperResolution() { this->num_threads = 3; // Init neural network int numLayerElements[]={40,40,1}; this->net = new NeuralNet(9,1,numLayerElements); this->net->nnLoadTheta("./test_neural_color_Y.wbs"); /*ỉnt numLayerElements[]={20,20,1}; this->net = new NeuralNet(8,3,numLayerElements); this->net->nnLoadTheta("./test_neural_gray.wbs");*/ } cv::Mat Image SuperResolution::get complex lev:: Mat complexMat, complex mode type mode){ cv: :Mat res; cv::Mat planes[] = {cv::Mat_(complexMat), cv::Mat::zeros(complexMat.size , CV32F)}; cv::split(complexMat, planes); if(mode == MAGNITUDE) cv::magnitude(planes[0], planes[1],res); else { cv::phase (planes[0], planes[11,res,false); for (int i = 0; i < res.cols; Í++ ) { for (int j = 0; j < res.rows; j++) { if ((res at (j, Ỉ) - M_PI) > 0.0000001) { 61 res at (j , i) = -2*M_PI + res at (j , i) ; } } ) } return res; } cv::Mat Image SuperResolution::complex divison(cv::Mat complexA, cv::Mat complexB){ cv::Mat complexQ; cv::Mat cA[] = (cv::Mat (complexA), cv::Mat::zeros(complexA.size 0, CV_32F)}; cv::Mat cB[] = (cv::Mat (complexB), cv::Mat::zeros(complexB.size 0, CV 32F)}; cv::Mat cQ[] = {cv::Mat_(complexB), cv::Mat::zeros(complexB.size 0, CV 32F)}; split (complexA, cA); split(complexB, cB); cv:: Ma t cB0_p2,cBl_p2; cv::pow(cB[0],2,cB0_p2); cv::pow(cB[l],2,cBl_p2); cQ[O] = (cA[O].mul(cB[0]) + cA[l].mul(cB[1]))/(cB0_p2 + cBl_p2); //real cQ[l] = (cA[l].mul(cB[0]) cA[O].mul(cB[1]))/(cB0_p2 + cBl_p2); //image cv::merge(cQ, 2, complexQ); return complexQ; } cv::Mat Image_SuperResolution::fftshift(cv: :Mat I) { int numRow = I.rows; 62 ỉnt numCol = I.cols; assert (numRow > 0) ; assert (numCol > 0) ; if((numRow %2) > 0) numRow = numRow + 1; if ((numCol %2) > 0) numCol = numCol + 1; cv::Mat padded; //expand input image to optimal size int m = cv::getOptimalDFTSize( numRow ); int n = cv::getOptimalDFTSize( numCol ); // on the border add zero values cv::copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0)); cv::Mat planes[] = {cv: :Mat_ (padded) , cv::Mat::zeros(padded.size 0, CV 32F)}; cv::Mat complexl; cv::merge(planes, 2, complexl); plane with zeros // Add to the expanded another cv::dft(complexl, complexl); the source matrix // this way the result may fit in assert (complexl.cols%2 == 0) ; assert(complexl.rows%2 == 0); // rearrange the quadrants of Fourier image so that the origin is at the image center int ex = complexl.cols/2; int cy = complexl.rows/2; cv::Mat qO(complexl, ROT per quadrant cv::Rect(0, cv: :Mat ql(complexl, cv::Rect(ex cv: :Mat q2 (complexl, cv::Rect(0, cv: :Mat q3 (complexl, cv: :Rect(ex, 0, ex, cy) ) ; 0, ex, cy) ) ; cy, ex, cy) ) ; cy, ex, cy) ) ; cv::Mat tmp; Bottom-Right) // Top-Left - Create a // Top-Right // Bottom-Left // Bottom-Right // swap quadrants (Top-Left with qO.copyTo(tmp); q3 copyTo (qO) ; tmp.copyTo(q3); ql.copyTo(tmp); Bottom-Left) // swap quadrant (Top-Right with q2 copy To (ql) ; tmp.copyTo(q2); return complexl; 63 cv: :Mat ImageSuperResolution:: shiftestimationproc(const cv::Mat hann const cv::Mat Sref, cv::Mat* im src in, uint numLrln) { cv::Mat deltaest; delta_est create (numLrIn,2 ,CV_32F) ; forfuint idx = ; idx < numLrln ; idx++) { cv::Mat im_src; // Apply hanning window if (im src in[idx].channels() == 1) im src = im src in[idx].mul(hann); else { //cv::Mat imgray; //cv::cvtColor (im src in[idx],im gray,cv::COLOR BGR2GRAY) ; //im_src = im_gray.mul(hann); vector spl; cv:: split (im_src_in[idx], spl); imsrc = spl[0].mul(hann); } // estimate planar shift cv::Mat S2 = fftshift(im src); cv::Mat Q = complex_divison(Sref,S2); cv::Mat A = get_complex(Q,PHASE); // determine the central part of the frequency spectrum to be used cv::Mat sz = (cv::Mat (2,1)« (float)Sref.rows,(float)Sref.cols); uint p[2] = (N,N) ; float numPixels = (2*p[0]+l) * (2*p[l]+l); (sz uint beginy = (uint) ceil(sz.at(0,0)/2-p[0]); ceil (sz at (0,0) /2+pi0] ) ; ceil uint uint endy beginx = (uint) = (uint) at (1,0) /2-p[l]) ; ceil (sz at (1,0) /2+p[l]) ; cv::Mat tmpMat; float start; uint endx = (uint) // get X tmpMat = cv::Mat(endx-beginx+l,1,cv 32F) ; start = beginx; for(uint i=0; inum_threads; forfuint i=0;inum_threads;i++){ if(i < this->num_threads -1 ) { numLrProcessed = ptrStep; } else { numLrProcessed = numLrln - i*ptrStep -1; } proc[i] = QtConcurrent::run( this, &Image_SuperResolution::shiftestimationproc, hann,Sl,&im_src_in[i*ptrStep+l], numLrProcessed ); } //cv: :vconcat (proc[0] result () ,proc[1 ] result () ,Delta_est) ; Delta_est = cv: :Mat:: zeros (1,2 ,CV_32F) ; forfuint i=0;inum_threads;i++){ proc[i].waitForFinished 0; cv::vconcat(Delta est,proc[Ỉ].result 0,Delta_est); } // float dx,dy; dx = 0; dy = 0; for(int i=0 ; i< Deltaest.rows ; Ỉ++){ if (dx > Delta_est at (i , 0) ) dx = Delta_est at (i , 0) ; if(dy > Deltaest.at(i,l)) dy = Deltaest.at(i,l); } for(int i=0 ; i< Deltaest.rows ; Ỉ++){ Deltaest.at(Ỉ , 0) = round(Deltaest.at(Ỉ,0) - dx); Deltaest.at(i,1) = round(Deltaest.at(i,1) - dy); 66 } return Deltaest; } void Image_SuperResolution: :mean_filter_at (int X, int y, cv::Mat& img) { cv::Scalar mean_res; cv: :Mat roi = imglev::Rect(y-1, x-1, 3, 3)); meanres = cv::sum(roi)/8.0; assert (img channels () ==1 I I img channels () ==3) ; if (img channels () == 1) { // gray image assert(img.at(x,y) == 0); img.at(x,y) = mean_res.val[0]; }else if (img channels () ==3) { assert(img.at(x,y)[0] == 0); assert(img.at(x,y)[1] == 0); assert(img.at(x,y)[2] == 0); img.at(x,y)[0] = mean_res.val[0]; img.atccv::Vec3f>(x,y)[1] = mean_res.val[1]; img.at(x,y)[2] = mean_res.val[2]; } return; } int ImageSuperResolution::interpolationimagelev::Mat& img, const cv::Mat pixelsidx){ cv: :Mat netlnputs; //assert((img.channels()==1 && this->net->nnlnfo.numlnput==8) // I I (img channels I) ==3 && this->net->nnlnfo.numlnput==24)); forfint i=O;inet->nnln fo.numinput]; int X = pixels idx at (i , 0) ; int y = pixels idx.at(i,l); //cv::Mat roi = img(cv::Rect(y-1, x-1, 3, 3)); /★if lev::countNonZero(roi) == 1) { 67 //roi.at(1,1) = cv::sum(roi).val[0]; } else {★/ // Gray image tmp[O] = img.at(x-l,y-l); tmp[l] = img.at(x ,y-l); tmp[2] = img.at(x+1,y-l); tmp[3] = img at (x-1 ,y ); tmp[4] = img at (x ,y ); tmp[5] = img.at(x+1,y ); tmp[6] = img.at(x-1,y+l); tmp[7] = img at (x ,y+l); tmp[8] = img.at(x+1,y+l); A = cv::Mat(1,this->net->nnlnfo.numinput,cv 32F,tmp); netlnputs.pushback(A); //} } cv::Mat B = this->net->nnPredict(netlnputs); forfint i=0;i(x,y)[1] = B at (i , 1) ; //G img.atccv::Vec3f>(x,y)[0] = B.at(i,2); //B } } return 1; } cv::Mat Image SuperResolution::image SR(cv::Mat* lr ims, cv::Mat delta est, int numLrln, int zoomFactor){ cv::Mat hrgrid; int hr rows = lr ims[0].rows * zoomFactor; int hr_cols = lr_ims[0].cols * zoomFactor; std::vector hr map; assert(lr ims[0].channels 0==1 II lr ims[0].channels 0==3); // Malloc memory by block (Avoid segment fault error) for(int row=0; row= hr cols) y = hr cols -1; if (lrims [ 0] channels () == 1) { hrgrid.at(x,y) += lrims[k],at(i,j); } else if (lrims [0] channels () == 3){ hrgrid.at(x,y)[0] += lrims[k].at(i,j)[0]; hr_grid.at(x,y)[1] += lr_ims[k],at(i,j)[1]; hrgrid.atccv::Vec3f>(x,y)[2] += lr_ims[k],at(i,j)[2]; } hrmap[x][y] += 1; } 69 ) } float sum; forfint 1=0; i(l,j)[0] = hr_grid at (i ,j) [0 ] /sum; hr_grld atccv: :Vec3f> (i,j) [1] = hr_grid at (1, j) [1 ]/sum; hr_grld.at (l,j) [2] = hrgrid.at(l,j)[2]/sum; } ) } } cv: :Mat pixels; forfint i=l; i< (hr_grid rows-1) ; Í++) { forfint j=l; j< (hrgrid cols-1) ; j++) { sum = (float) hr_map [i] [j ] ; if (hrmap [i] [j == 0) { cv: :Mat tmp = lev: :Mat_ (1,2) « i,j); pixels.pushback(tmp); } } } if (pixels rows > 0) { vector spl; cv:: split (hr_grid, spl) ; this->interpolation_image (spl[0],pixels); this->interpolation_image (spl[1],pixels); this->interpolation_image(spl[2] ,pixels); cv: :merge (spl ,hr_grid) ; } else { //cout « "no interpolation " « endl;} cv: :medianBlur (hr grid,hr grid, 3); return hr grid; } 70 e main.cpp int main(int argc, char *argv[J) { int NUM_LR_IN = 8; int ZOOMFACTOR = 2; // Capture Video frame int k; cv::Mat* lr_im; VideoCapture cap(O); // open the default camera cap set (CV_CAP_PROP_FRAME_WIDTH, 320) ; cap set (CV_CAP_PROP_FRAME_HEIGHT,240) ; if(1 cap.isOpened0) // check if we succeeded return -1; cv::namedWindow("Image Capture",1); for(;;) { cv::Mat frame; cap.read(frame); // get a new frame from camera cv::imshow("Image Capture", frame); k = cv::waitKey(1) & 255; if (k == 27) //ESC code return 1; if(k == (int) ’c’) //c character break; } // Capture Image lr Im = new cv::Mat[NUM LR IN]; forfint i=0;Ỉ

Ngày đăng: 15/01/2020, 20:04

Tài liệu cùng người dùng

Tài liệu liên quan