diff --git a/IRImageProcessing/Source.cpp b/IRImageProcessing/Source.cpp index 6fd4656..5578528 100644 --- a/IRImageProcessing/Source.cpp +++ b/IRImageProcessing/Source.cpp @@ -116,6 +116,22 @@ return bifurcationPoints; } +cv::Mat removeSmallAreaImage(const cv::Mat& src, const double areaThreshold) +{ + cv::Mat dst; + dst = src.clone(); + std::vector> contours; + cv::findContours(src, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + // �ʐς�臒l�ȉ��̗֊s���폜 + for (int i = 0; i < contours.size(); i++) { + double area = cv::contourArea(contours[i]); + if (area <= areaThreshold) { + cv::drawContours(dst, contours, i, cv::Scalar(0), cv::FILLED); + } + } + return dst; +} + cv::Mat inverseImage(const cv::Mat& src) { cv::Mat invertedImage; @@ -123,9 +139,8 @@ return invertedImage; } -cv::Mat maximumImage(const cv::Mat& img1, const cv::Mat& img2) { - - +cv::Mat maximumImage(const cv::Mat& img1, const cv::Mat& img2) +{ cv::Mat maxImage = img1.clone(); // ���ʂ��i�[����Mat���쐬�iimg1�̃R�s�[���g�p�j cv::max(img1, img2, maxImage); @@ -228,6 +243,7 @@ src.convertTo(src64F, CV_64F); cv::Mat margeImage = cv::Mat::zeros(src64F.size(), CV_64F); cv::Mat marge8UImage; + cv::Mat margeNormImage; // Find the angle that gives the maximum sum of gaborImage8U for (int i = 0; i < division; i++, angle += (180 / division)) @@ -237,17 +253,21 @@ cv::Mat kern = cv::getGaborKernel(cv::Size(ksize, ksize), sigma, theta, lambda, gamma, psi, CV_64F); kern /= cv::sum(kern)[0]; - cv::Mat gaborImage, gabor8UImage, gaborBinaryImage; + cv::Mat gaborImage, gabor8UImage, gaborBinaryImage, gaborNormImage; cv::filter2D(src64F, gaborImage, CV_64F, kern); //�摜�̌^�ϊ��Ɛ��K�� - double minVal, maxVal; - cv::minMaxLoc(gaborImage, &minVal, &maxVal); // gaborImage�̍ŏ��l�ƍő�l���擾 + double gaborMinVal, gaborMaxVal; + cv::minMaxLoc(gaborImage, &gaborMinVal, &gaborMaxVal); // gaborImage�̍ŏ��l�ƍő�l���擾 margeImage = maximumImage(gaborImage, margeImage); + cv::normalize(gaborImage, gaborNormImage, 0, 255, cv::NORM_MINMAX, CV_8U); + + // �^�ϊ� + gaborImage.convertTo(gabor8UImage, CV_8U, 255.0 / (gaborMaxVal - gaborMinVal), -gaborMinVal * 255.0 / (gaborMaxVal - gaborMinVal)); + - gaborImage.convertTo(gabor8UImage, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal)); - margeImage.convertTo(marge8UImage, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal)); + //cv::threshold(gabor8UImage, gaborBinaryImage, 128 , 255, cv::THRESH_BINARY); //cv::adaptiveThreshold(gabor8UImage, gaborBinaryImage, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 101, 10); @@ -268,9 +288,12 @@ cv::convertScaleAbs(diffImage, gaborImageScaled, 1.0 / division); std::string fileStr = std::to_string(i) + "_over_" + std::to_string(division) + "pi"; + + //std::cout << fileStr << ":min = " << gaborMinVal << " :max = " << gaborMaxVal << std::endl; // �摜�̕ۑ� cv::imwrite(dirName + "/Gabor_" + fileStr + ".png", gaborImage); cv::imwrite(dirName + "/Gabor8U_" + fileStr + ".png", gabor8UImage); + cv::imwrite(dirName + "/GaborNorm_" + fileStr + ".png", gaborNormImage); //cv::imwrite(dirName + "/diff_" + fileStr + ".png", diffImage); //cv::imwrite(dirName + "/GaborOtsuBinaryImage_" + fileStr + ".png", gaborBinaryImage); @@ -282,11 +305,19 @@ } - cv::Mat margeOtsuBinaryImage; - cv::threshold(marge8UImage, margeOtsuBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); + double margeMinVal, margeMaxVal; + cv::minMaxLoc(margeImage, &margeMinVal, &margeMaxVal); // �ŏ��l�ƍő�l���擾 + margeImage.convertTo(marge8UImage, CV_8U, 255.0 / (margeMaxVal - margeMinVal), -margeMinVal * 255.0 / (margeMaxVal - margeMinVal)); + cv::normalize(margeImage, margeNormImage, 0, 255, cv::NORM_MINMAX, CV_8U); + cv::Mat margeOtsuBinaryImage, removedMargeOtsuBinaryImage; + cv::threshold(margeNormImage, margeOtsuBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); + double areaThreshold = 1000.0; + removedMargeOtsuBinaryImage = removeSmallAreaImage(margeOtsuBinaryImage, areaThreshold); cv::imwrite(dirName + "/MargeOtsuBinaryImage.png", margeOtsuBinaryImage); + cv::imwrite(dirName + "/RemovedMargeSmallAreaBinaryImage_" + std::to_string((int)areaThreshold) + ".png", removedMargeOtsuBinaryImage); cv::imwrite(dirName + "/Marge.png", margeImage); cv::imwrite(dirName + "/Marge8U.png", marge8UImage); + cv::imwrite(dirName + "/MargeNorm.png", margeNormImage); //BinaryProcessing(ori, margeImage, dirName); } @@ -305,7 +336,8 @@ // output�f�B���N�g�������݂��Ȃ��ꍇ�͍쐬 - if (!std::filesystem::exists(baseDir)) { + if + (!std::filesystem::exists(baseDir)) { std::filesystem::create_directory(baseDir); } @@ -335,7 +367,7 @@ // �R���g���X�g���� cv::Mat claheOtsuBinaryImage; - cv::threshold(claheImage, claheOtsuBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); + cv::threshold(claheImage, claheOtsuBinaryImage, 128, 255, cv::THRESH_BINARY); //BinaryProcessing(windowedImage, claheImage, dirName);