best image segmentation

asked 2017-01-12 22:52:36 -0500

dineshlama gravatar image

updated 2017-01-13 19:04:25 -0500

Hello my beautiful computer vision lovers. Can anyone tell me the best way to do image segmentation with opencv, i tried watershed method as mentioned in opencv:Image segmentation with distance transform with watershed method. So is their more better method of image segmentation in opencv, or do anyone have implemented his own than if possible share with me. Thank u:> My program used ros to subscribe an image topic from a simulated kinect sensor from gazebo than used it for image segmentation:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
static const std::string OPENCV_WINDOW = "Image window";

class ImageConverter
  ros::NodeHandle nh_;
  image_transport::ImageTransport it_;
  image_transport::Subscriber image_sub_;
  image_transport::Publisher image_pub_;

    : it_(nh_)
    // Subscrive to input video feed and publish output video feed
    image_sub_ = it_.subscribe("/camera/rgb/image_raw", 1,
      &ImageConverter::imageCb, this);
    image_pub_ = it_.advertise("/image_converter/output_video", 1);



  void imageCb(const sensor_msgs::ImageConstPtr& msg)
    cv_bridge::CvImagePtr cv_ptr;
      cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
    catch (cv_bridge::Exception& e)
      ROS_ERROR("cv_bridge exception: %s", e.what());

    // Draw an example circle on the video stream
    if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
      cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));
    // Load the image
    Mat src = cv_ptr->image;

    // Show source image
    imshow("Source Image", src);
    // Change the background from white to black, since that will help later to extract
    // better results during the use of Distance Transform
    for( int x = 0; x < src.rows; x++ ) {
      for( int y = 0; y < src.cols; y++ ) {
          if (<Vec3b>(x, y) == Vec3b(255,255,255) ) {
  <Vec3b>(x, y)[0] = 0;
  <Vec3b>(x, y)[1] = 0;
  <Vec3b>(x, y)[2] = 0;
    // Show output image
    imshow("Black Background Image", src);
    // Create a kernel that we will use for accuting/sharpening our image
    Mat kernel = (Mat_<float>(3,3) <<
            1,  1, 1,
            1, -8, 1,
            1,  1, 1); // an approximation of second derivative, a quite strong kernel
    // do the laplacian filtering as it is
    // well, we need to convert everything in something more deeper then CV_8U
    // because the kernel has some negative values,
    // and we can expect in general to have a Laplacian image with negative values
    // BUT a 8bits unsigned int (the one we are working with) can contain values from 0 to 255
    // so the possible negative number will be truncated
    Mat imgLaplacian;
    Mat sharp = src; // copy source image to another temporary one
    filter2D(sharp, imgLaplacian, CV_32F, kernel);
    src.convertTo(sharp, CV_32F);
    Mat imgResult = sharp - imgLaplacian;
    // convert back to 8bits gray scale
    imgResult.convertTo(imgResult, CV_8UC3);
    imgLaplacian.convertTo(imgLaplacian, CV_8UC3);
    // imshow( "Laplace Filtered Image", imgLaplacian );
    imshow( "New Sharped Image", imgResult );
    src = imgResult; // copy back
    // Create binary image from source image
    Mat bw;
    cvtColor(src, bw, CV_BGR2GRAY);
    threshold(bw, bw, 40, 255 ...
edit retag flag offensive close merge delete


You can simply use one of the SegNet implementation through the opencv_dnn module

pi-null-mezon gravatar imagepi-null-mezon ( 2017-01-13 08:21:00 -0500 )edit (link text) I've uploaded the reslults in here.

dineshlama gravatar imagedineshlama ( 2017-01-13 13:41:04 -0500 )edit
LBerger gravatar imageLBerger ( 2017-01-13 14:09:14 -0500 )edit