[Insight-users] Adaptive thresholding by region
Lassi Paavolainen
lassi.paavolainen at jyu.fi
Mon May 10 06:55:09 EDT 2010
Hi Loic,
You might want to have a look at following Insight Journal paper that
should do exactly what you plan to do:
http://insight-journal.org/browse/publication/702
Best regards,
Lassi
On Mon, 10 May 2010, Loïc Giraldi wrote:
> Hi all!
>
> I'm trying to make an adaptive thresholding using the Otsu method. To do so,
> I want to process my image by region. The idea is to separate the original
> picture in several blocks, process each block and reconstruct the final
> output by gathering the blocks.
> I am trying to do it using the RegionOfInterestImageFilter, the
> OtsuThresholdImageFilter and the PasteImageFilter in a loop over regions, I
> have grabbed some informations in this mailing list but I can't manage to
> make it working. The process works if I do not loop over regions.
>
> Here is my code:
>
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
>
> #include "itkRegionOfInterestImageFilter.h"
> #include "itkOtsuThresholdImageFilter.h"
> #include "itkPasteImageFilter.h"
>
> #include <iostream>
> #include <string>
> #include <sstream>
> #include <cstdlib>
> using namespace std;
>
>
> template <typename T> string toString(T val){
> ostringstream oss;
> oss << val;
> return oss.str();
> }
>
> int main(int argc, char *argv[]){
> //////////////////////////// Usage //////////////////////////////
> if (argc<3){
> std::cerr << "Missing arguments!" << std::endl;
> std::cerr << "Usage : " << argv[0]
> << " InputFile"
> << " Size" << std::endl;
> return 1;
> }
>
> const char *inputFileName = argv[1];
> const unsigned int size = atoi(argv[2]);
>
> ////////////////////// Image definitions ////////////////////////
> const int Dimension = 3;
>
> typedef unsigned short InputPixelType;
> typedef unsigned char OutputPixelType;
>
> typedef itk::Image< InputPixelType, Dimension > InputImageType;
> typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
>
> //////////////////////// Image reading //////////////////////////
> typedef itk::ImageFileReader< InputImageType > ReaderType;
>
> ReaderType::Pointer reader = ReaderType::New();
> reader->SetFileName(inputFileName);
> try{
> reader->Update();
> }
> catch( itk::ExceptionObject & excep ){
> std::cerr << "Exception caught !" << std::endl;
> std::cerr << excep << std::endl;
> }
>
> ////////////////////////// Filtering ////////////////////////////
> //Output Allocation
> OutputImageType::Pointer output = OutputImageType::New();
> OutputImageType::IndexType outIndex;
> OutputImageType::SizeType outSize;
> OutputImageType::RegionType outRegion;
>
> for (int i = 0; i < Dimension; ++i){
> outIndex[i]=reader->GetOutput()->GetBufferedRegion().GetIndex()[i];
> outSize[i]=reader->GetOutput()->GetBufferedRegion().GetSize()[i];
> }
>
> outRegion.SetIndex(outIndex);
> outRegion.SetSize(outSize);
>
> output->SetRegions(outRegion);
> output->Allocate();
> output->FillBuffer(0);
>
> //Moving box definition
> InputImageType::IndexType boxIndex;
> InputImageType::SizeType boxSize;
> InputImageType::RegionType boxRegion;
>
> for (int i = 0; i < Dimension; ++i){
> boxIndex[i] = outIndex[i];
> }
> for (int i = 0; i < Dimension; ++i){
> boxSize[i] = size;
> }
>
> boxRegion.SetIndex(boxIndex);
> boxRegion.SetSize(boxSize);
>
> unsigned numberOfBoxes[3];
> for (int i = 0; i < Dimension; ++i){
> numberOfBoxes[i] = static_cast<unsigned>((outSize[i]/size));
> }
>
> //Processing
> typedef itk::RegionOfInterestImageFilter< InputImageType,
> InputImageType> ROIFilterType;
> typedef itk::OtsuThresholdImageFilter< InputImageType, OutputImageType >
> OtsuThresholdFilterType;
> typedef itk::PasteImageFilter<OutputImageType> PasteImageFilterType;
>
> ROIFilterType::Pointer roi = ROIFilterType::New();
> OtsuThresholdFilterType::Pointer otsu = OtsuThresholdFilterType::New();
> PasteImageFilterType::Pointer paste = PasteImageFilterType::New();
>
> for(unsigned i = 0; i < numberOfBoxes[0]; ++i){
> for(unsigned j = 0; j < numberOfBoxes[1]; ++j){
> for(unsigned k = 0; k < numberOfBoxes[2]; ++k){
>
> boxIndex[0] += i * size;
> boxIndex[1] += j * size;
> boxIndex[2] += k * size;
> boxRegion.SetIndex(boxIndex);
>
> roi->SetInput(reader->GetOutput());
> roi->SetRegionOfInterest(boxRegion);
>
> try{
> roi->UpdateLargestPossibleRegion();
> roi->Update();
> }
> catch( itk::ExceptionObject & excep ){
> std::cerr << "ROI!" << std::endl;
> std::cerr << "Exception caught !" << std::endl;
> std::cerr << excep << std::endl;
> }
>
> otsu->SetInput(roi->GetOutput());
> otsu->SetNumberOfHistogramBins(128);
> otsu->SetInsideValue(255);
> otsu->SetOutsideValue(0);
>
> try{
> otsu->UpdateLargestPossibleRegion();
> otsu->Update();
> }
> catch( itk::ExceptionObject & excep ){
> std::cerr << "Otsu!" << std::endl;
> std::cerr << "Exception caught !" << std::endl;
> std::cerr << excep << std::endl;
> }
> otsu->Print(std::cout);
>
> paste->SetDestinationImage(output);
> paste->SetSourceImage(otsu->GetOutput());
> paste->SetDestinationIndex( boxIndex );
> paste->SetSourceRegion( boxRegion );
>
> try{
> paste->UpdateLargestPossibleRegion();
> paste->Update();
> }
> catch( itk::ExceptionObject & excep ){
> std::cerr << "Paste!" << std::endl;
> std::cerr << "Exception caught !" << std::endl;
> std::cerr << excep << std::endl;
> std::cerr << "i,j,k = " << i << ',' << j << ',' << k <<
> std::endl;
> boxRegion.Print(std::cerr);
> paste.Print(std::cerr);
> paste->GetOutput()->Print(std::cerr);
> }
> output = paste->GetOutput();
> output->DisconnectPipeline();
> }
> }
> }
>
> //////////////////////// Image writing //////////////////////////
> typedef itk::ImageFileWriter< OutputImageType > WriterType;
>
> WriterType::Pointer writer = WriterType::New();
>
> string outputFileName(inputFileName);
> size_t pos = outputFileName.find_last_of('.');
> outputFileName.insert(pos, "_result_"+toString(size));
>
> writer->SetInput(output);
> writer->SetFileName(outputFileName.c_str());
> writer->Update();
> try{
> writer->Update();
> }
> catch( itk::ExceptionObject & excep ){
> std::cerr << "Write!" << std::endl;
> std::cerr << "Exception caught !" << std::endl;
> std::cerr << excep << std::endl;
> }
> return 0;
> }
>
> Thanks for your help,
> Regards,
> Loïc
>
>
>
More information about the Insight-users
mailing list