diff options
author | Franklin Wei <franklin@rockbox.org> | 2020-01-14 14:01:25 -0500 |
---|---|---|
committer | Franklin Wei <franklin@rockbox.org> | 2020-01-14 14:01:25 -0500 |
commit | f0978d7ad7af3036a479b23ae582a8aafb7587ed (patch) | |
tree | e10d66ba81930d24292e4fec2b5ce682239a6bbf | |
parent | 0ab44fded43696d9ec1de41247b0ba821a148a22 (diff) | |
download | sloreg-f0978d7ad7af3036a479b23ae582a8aafb7587ed.zip sloreg-f0978d7ad7af3036a479b23ae582a8aafb7587ed.tar.gz sloreg-f0978d7ad7af3036a479b23ae582a8aafb7587ed.tar.bz2 sloreg-f0978d7ad7af3036a479b23ae582a8aafb7587ed.tar.xz |
Perform alignment on filtered images
Makes ECC work passably.
-rw-r--r-- | gabor.cpp | 46 |
1 files changed, 32 insertions, 14 deletions
@@ -23,11 +23,11 @@ using namespace std; // parameters were lifted off the internet Mat maximalGaborFilter(Mat in, int nfilts = 10, - int ksize = 9, - double sig = 3, - double lm = 8, - double gm = 0.02, - double ps = 0) { + int ksize = 9, // kernel size + double sig = 3, // variance -- how wide the filter is + double lm = 8, // wavelength ? + double gm = 0.02, // aspect ratio (smaller = longer vessels), 1 : square, >1 : bad + double ps = 0) { // phase shift -- don't change? Mat filtered[nfilts]; double dtheta = 2 * M_PI / nfilts; @@ -236,7 +236,11 @@ void floodFill(int x, int y, Mat map, Mat visited, unsigned char target, unsigne } Mat removeSatRegion(Mat mask, Mat orig) { - Rect roi = selectROI("select saturation region", orig); + static bool firstRun = true; + + static Rect roi; + if(firstRun) + roi = selectROI("select saturation region", orig), firstRun = false; rectangle(mask, roi, Scalar(0), FILLED); return mask; @@ -288,7 +292,7 @@ void dumpHist(int *hist) { Mat redGreenOverlay(Mat rPlane, Mat gPlane) { assert(rPlane.size() == gPlane.size()); Mat planes[3] = { Mat::zeros(rPlane.size(), CV_8U), - gPlane, + gPlane * .6, rPlane }; Mat out; merge(planes, 3, out); @@ -299,13 +303,15 @@ int main() { // filtering parameters const int nfilts = 10; - Mat reference; + Mat reference, reference_filtered; // alignment parameters + //bool + bool homography = false; int ecc_iters = 100; double ecc_eps = 1e-5; - int warp_mode = MOTION_AFFINE; + int warp_mode = MOTION_TRANSLATION; while(1) { @@ -318,11 +324,12 @@ int main() Mat img_c3; img_c3 = imread(buf); - resize(img_c3, img_c3, Size(512, 512)); + resize(img_c3, img_c3, Size(500, 500)); // grayscale conversion Mat img; cvtColor(img_c3, img, COLOR_BGR2GRAY); + //GaussianBlur(img, img, Size(15, 15), 0, 0); imshow("orig", img); @@ -371,19 +378,27 @@ int main() imshow("mask", mask); // if you want a magenta background - //Mat masked = Mat(mask.size(), CV_8UC3, Scalar(0xff, 0, 0xff)); - Mat masked; + Mat masked = Mat(mask.size(), CV_8UC3, Scalar(0xff, 0, 0xff)); + //Mat masked; img.copyTo(masked, mask); imshow("extracted", masked); + Mat masked_filter_result = Mat(mask.size(), CV_8UC3, Scalar(0xff, 0, 0xff)); + //Mat masked_filter_result; + result.copyTo(masked_filter_result, mask); + imshow("extracted & filtered", masked_filter_result); + // plot histogram Mat histplot = plotHist(hist, ymax, t); imshow("hist", histplot); // try alignment if(reference.empty()) + { reference = masked; + reference_filtered = masked_filter_result; + } else { Mat warp_matrix; @@ -392,14 +407,16 @@ int main() else warp_matrix = Mat::eye(2, 3, CV_32F); - double coeff = findTransformECC(reference, - masked, + double coeff = findTransformECC(/*reference,*/ reference_filtered, + /*masked,*/ masked_filter_result, warp_matrix, warp_mode, TermCriteria (TermCriteria::COUNT+TermCriteria::EPS, ecc_iters, ecc_eps), mask); + Mat warped_image = Mat(reference.rows, reference.cols, CV_32FC1); + if (warp_mode != MOTION_HOMOGRAPHY) warpAffine(masked, warped_image, warp_matrix, warped_image.size(), INTER_LINEAR + WARP_INVERSE_MAP); @@ -409,6 +426,7 @@ int main() imshow("aligned", warped_image); + cout << "ECC coef: " << coeff << endl; cout << "Sizes: " << warped_image.size() << ", " << reference.size() << endl; // create red/green overlay |