#pragma once
#include "myOpenCV3.h"
#include <chrono>
class ImageProcessor {
public:
// コンストラクタで入力画像を受け取る
void inputProcess(const cv::Mat& inputImage);
// 画像処理を実行するメソッド
void applyCLAHEProcess();
void applyGaborProcess();
void applyAllProcess();
void setCLAHETile(int CLAHETileSize);
void setCLAHEClipLimit(double CLAHEClipLimit);
// 各処理後の画像を取得するためのgetterメソッド
cv::Mat getOriginalImage() const;
cv::Mat getCLAHEImage() const;
cv::Mat getGaborImage() const;
cv::Mat getBinaryImage() const;
cv::Mat getSmallRegionRemovedImage() const;
cv::Mat getThinnedImage() const;
cv::Mat getCircleImage() const;
std::vector<cv::Point> getBranchPoints() const;
private:
cv::Mat m_originalImage;
cv::Mat m_maskAreaImage;
cv::Mat m_distanceMap;
cv::Mat m_maskOriginalImage;
cv::Mat m_claheImage;
cv::Mat m_gaborImage;
cv::Mat m_binaryImage;
cv::Mat m_smallRegionRemovedImage;
cv::Mat m_thinnedImage;
cv::Mat m_circleImage;
std::vector<cv::Point> m_branchPoints;
int m_CLAHETileSize = 17;
double m_CLAHEClipLimit = 10.0;
// 各種画像処理関数
// その他のヘルパー関数
void removeSmallArea(const cv::Mat& binaryImage, cv::Mat& smallRegionRemovedImage, double areaThreshold);
void thinning(const cv::Mat& smallRegionRemovedImage, cv::Mat& thinnedImage);
void thinningIteration(cv::Mat& smallRegionRemovedImage, int iteration);
std::vector<cv::Point> extractBifurcationPoints(const cv::Mat& thinnedImage, const cv::Mat& distanceMap, int borderSize, float minDistance);
std::vector<cv::Point> extractStrictBifurcationPoints(const cv::Mat& thinnedImage, int borderSize);
std::vector<cv::Point> extractDistanceMapBifurcationPoints(const cv::Mat& thinnedImage, const cv::Mat& distanceMap, int borderSize, float minDistance);
// その他の画像処理関数
};
void visualizeBranchLengthMap(const std::vector<std::vector<int>>& branchLengthMap);
cv::Mat inverseImage(const cv::Mat& src);
cv::Mat maximumImage(const cv::Mat& src1, const cv::Mat& src2);