1

傷のセグメンテーションにローカル ヒストグラム アプローチを試しましたが、これはすべての種類の画像でうまく機能しませんでした。次に、傷のセグメンテーションにウェーブレット変換を使用する方法を教えました。

傷のセグメンテーションに適したウェーブレット変換と、それを実装するためのヒントはどれですか??

すべての光条件でウェーブレット変換を使用してセグメントを作成するよりも良い方法はありますか??

また、イメージ クラスタリングも試しましたが、うまくいきませんでした。

以下に、使用したテスト ケースとクラスタリング プログラムをいくつか示します。

#include "cv.h"
#include "highgui.h"

#include <iostream>
void show_result(const cv::Mat& labels, const cv::Mat& centers, int height, int width);
int main(int argc, const char * argv[])
{    
        cv::Mat image = cv::imread("kmean.jpg");
        if ( image.empty() ) {
                std::cout << "unable to load an input image\n";
                return 1;
        }
        //cv::cvtColor(image,image,CV_BGR2HSV);
        std::cout << "image: " << image.rows << ", " << image.cols << std::endl;
        assert(image.type() == CV_8UC3);
        cv::imshow("image", image);

        cv::Mat reshaped_image = image.reshape(1, image.cols * image.rows);
        std::cout << "reshaped image: " << reshaped_image.rows << ", " << reshaped_image.cols << std::endl;
        assert(reshaped_image.type() == CV_8UC1);
        //check0(image, reshaped_image);

        cv::Mat reshaped_image32f;
        reshaped_image.convertTo(reshaped_image32f, CV_32FC1, 1.0 / 255.0);
        std::cout << "reshaped image 32f: " << reshaped_image32f.rows << ", " << reshaped_image32f.cols << std::endl;
        assert(reshaped_image32f.type() == CV_32FC1);

        cv::Mat labels;
        int cluster_number = 4;
        cv::TermCriteria criteria(cv::TermCriteria::COUNT, 100, 1);
        cv::Mat centers;
        cv::kmeans(reshaped_image32f, cluster_number, labels, criteria, 1, cv::KMEANS_PP_CENTERS, centers);

        show_result(labels, centers, image.rows,image.cols);

        return 0;
}

void show_result(const cv::Mat& labels, const cv::Mat& centers, int height, int width)
{
        std::cout << "===\n";
        std::cout << "labels: " << labels.rows << " " << labels.cols << std::endl;
        std::cout << "centers: " << centers.rows << " " << centers.cols << std::endl;
        assert(labels.type() == CV_32SC1);
        assert(centers.type() == CV_32FC1);

        cv::Mat rgb_image(height, width, CV_8UC3);
        cv::MatIterator_<cv::Vec3b> rgb_first = rgb_image.begin<cv::Vec3b>();
        cv::MatIterator_<cv::Vec3b> rgb_last = rgb_image.end<cv::Vec3b>();
        cv::MatConstIterator_<int> label_first = labels.begin<int>();

        cv::Mat centers_u8;
        centers.convertTo(centers_u8, CV_8UC1, 255.0);
        cv::Mat centers_u8c3 = centers_u8.reshape(3);

        while ( rgb_first != rgb_last ) {
                const cv::Vec3b& rgb = centers_u8c3.ptr<cv::Vec3b>(*label_first)[0];
                *rgb_first = rgb;
                ++rgb_first;
                ++label_first;
        }
        cv::imshow("tmp", rgb_image);


        cv::waitKey();
}

would-1 with background : (2 つのクラスター)

背景付きの Will-1

背景なしのWold-1:

背景なしのWold-1

背景付きの2:

だろう-2 背景あり

背景なしのWould-2 : (3つのクラスター)

背景なしの2

背景を削除すると、セグメンテーションが少し改善されますが、背景を削除するために、手動操作に依存するグラブカットを使用しています。そのため、100% の成功例を達成するには、画像をセグメント化するための kmean-clustering の代替 (または) 上記のコードのいくつかの改善が必要です。

それで、傷を分割するより良い方法はありますか??

4

1 に答える 1

1

従来のウェーブレット変換を使用する代わりに、Viola Jones 顔検出器で使用される積分画像の基礎と同様に、オブジェクト検出タスク用に調整された Haar のようなウェーブレットを試してみることをお勧めします。一般的なオブジェクトの検出に使用される Lienhart らによるこの論文は、良い出発点となるでしょう。

サンプル画像の外観から、傷の小さなピクセル近傍内の強度の分散ははるかに高くなりますが、傷のない皮膚は小さな近傍でかなり均一に見えます. Lienhart の論文は、そのようなバリエーションを検出できるはずです。機能を機械学習のセットアップにフィードするか、手動で観察して検索ウィンドウと関連するヒューリスティックを定義することができます。

お役に立てれば。

于 2015-02-10T07:35:32.997 に答える