www.pudn.com > segmentaion.rar > Source1.cpp


#include "stdafx.h" 
#include  
#include  
 
using namespace System::Drawing; 
using namespace System::Drawing::Imaging; 
 
typedef std::pair MyPoint; 
typedef std::vector MyPointVec; 
typedef int GrayLevel; 
 
// Make kernel by radius 
MyPointVec makeKernel(const int&); 
// Process erosion 
Bitmap^ erosion(Bitmap^, const MyPointVec%);  
// Get min gray level by kernel 
GrayLevel getMinByKernel(Bitmap^, const MyPointVec%, const MyPoint%); 
// Get gray level from Color object 
GrayLevel getGrayLevelFromColor(Color^); 
 
int main() { 
  // Read image from lena.jpg 
  Bitmap^ image = gcnew Bitmap("lena.jpg"); 
  const int radius = 2; 
  // Make kernel by radius 
  MyPointVec kernel = makeKernel(radius); 
  // New eroded image 
  Bitmap^ newImage = erosion(image, kernel); 
  // Save new eroded image to disk 
  newImage->Save("GrayscaleErodedLena.jpg"); 
 
  return 0; 
} 
 
// Make kernel by radius 
MyPointVec makeKernel(const int& radius) { 
  MyPointVec kernel; 
 
  if (radius == 0) { 
    kernel.push_back(std::make_pair(0,0)); 
  } 
  else if (radius == 1) { 
    //   * 
    //  *** 
    //   * 
    kernel.push_back(std::make_pair(0,0)); 
    kernel.push_back(std::make_pair(1,0)); 
    kernel.push_back(std::make_pair(0,1)); 
    kernel.push_back(std::make_pair(-1,0)); 
    kernel.push_back(std::make_pair(0,-1)); 
  } 
  else { 
    kernel.push_back(std::make_pair(-1,2)); 
    kernel.push_back(std::make_pair(0,2)); 
    kernel.push_back(std::make_pair(1,2)); 
 
    kernel.push_back(std::make_pair(-2,1)); 
    kernel.push_back(std::make_pair(-1,1)); 
    kernel.push_back(std::make_pair(0,1)); 
    kernel.push_back(std::make_pair(1,1)); 
    kernel.push_back(std::make_pair(2,1)); 
 
    kernel.push_back(std::make_pair(-2,0)); 
    kernel.push_back(std::make_pair(-1,0)); 
    kernel.push_back(std::make_pair(0,0)); 
    kernel.push_back(std::make_pair(1,0)); 
    kernel.push_back(std::make_pair(2,0)); 
 
    kernel.push_back(std::make_pair(-2,-1)); 
    kernel.push_back(std::make_pair(-1,-1)); 
    kernel.push_back(std::make_pair(0,-1)); 
    kernel.push_back(std::make_pair(1,-1)); 
    kernel.push_back(std::make_pair(2,-1)); 
 
    kernel.push_back(std::make_pair(-1,-2)); 
    kernel.push_back(std::make_pair(0,-2)); 
    kernel.push_back(std::make_pair(1,-2)); 
  } 
 
  return kernel; 
} 
 
// Process erosion  
Bitmap^ erosion(Bitmap^ image, const MyPointVec% kernel) { 
  // New dilated image 
  Bitmap^ newImage = gcnew Bitmap(image->Width, image->Height); 
  for(int x = 0; x != image->Width; ++x) { 
    for(int y = 0; y != image->Height; ++y) { 
      // Get max gray level by kernel 
      GrayLevel gray = getMinByKernel(image, kernel, std::make_pair(x,y)); 
      // Set max gray level to new dilated image 
      newImage->SetPixel(x, y, Color::FromArgb(gray, gray, gray)); 
    } 
  } 
 
  return newImage; 
} 
 
// Get min gray level by kernel 
GrayLevel getMinByKernel(Bitmap^ image, const MyPointVec% kernel, const MyPoint% point) { 
  typedef std::vector NeighborColor; 
  NeighborColor neighborColor; 
 
  // C++/CLI's new for each syntax 
  for each (MyPoint kpoint in kernel) { 
    int x = point.first + kpoint.first; 
    int y = point.second + kpoint.second; 
    if (x >= 0 && x < image->Width) { 
      if (y >= 0 && y < image->Height) { 
        GrayLevel gray = getGrayLevelFromColor(image->GetPixel(x, y)); 
        // push_back new gray level to vector 
        neighborColor.push_back(gray); 
      } 
    } 
  } 
 
  // Use STL min_element() algorithm to get max gray level 
  NeighborColor::iterator minIter = min_element(neighborColor.begin(), neighborColor.end()); 
 
  return *minIter; 
} 
 
// Get gray level from Color object 
GrayLevel getGrayLevelFromColor(Color^ color) { 
  return (color->R + color->G + color->B) /3; 
}