Ask Your Question

How to Erode the border and get rectangel shape?

asked 2013-11-21 21:50:20 -0600

zawpai gravatar image

updated 2013-11-26 18:10:21 -0600

Hi All,

Does anyone give me some suggestions? This is my image,Sample.bmp, I want to remove some unwanted part from border and get the corrected rectangle shape. So, how should I do? Currently, I am using "Blob Analysis". So, the result always include the unwanted region. But, I don't know how to remove it not effect the rectangle shape.

Another sample image, sample2.bmp

Regards, zawpai

edit retag flag offensive close merge delete


Haris gravatar imageHaris ( 2013-11-22 04:43:24 -0600 )edit

Hi Haris, Thanks for your reply.

zawpai gravatar imagezawpai ( 2013-11-25 22:19:31 -0600 )edit

Hi Haris,

May I ask you one thing. My image has 4 borders. So, should I need to iterate 4 times?

zawpai gravatar imagezawpai ( 2013-11-26 03:19:39 -0600 )edit

I didn’t get your point exactly, and may depend on your algorithm.

Haris gravatar imageHaris ( 2013-11-26 03:32:04 -0600 )edit

Could you please take a look my new image, "sample2.bmp"? According to this image, I need to remove both Left and Right portions. So, I may need to remove 4 sides to get the rectangle. Do you have any better ideal?

zawpai gravatar imagezawpai ( 2013-11-26 18:27:43 -0600 )edit

1 answer

Sort by » oldest newest most voted

answered 2013-11-27 05:59:55 -0600

Haris gravatar image

updated 2013-11-27 06:07:53 -0600

You can solve it out by either of the two method explained below.

First method.

  • Convert to Gray.

  • Threshold the image.

  • Find the biggest contour in the threshold image, which will represent boundary of your object.

  • Find the convexHull of the biggest contour.

  • Compute the largest rectangle inside the convex polygon. See a good explanation here

Second method.

This one is relatively simple compared to above.

  • Convert to Gray.
  • Threshold the image
  • Find biggest contour to segment object region and draw contour to new Mat.
  • Apply morphologyEx, here we use morphological Opening . And another thing is that we will use larger kernel size along one direction(x or y) to remove unwanted boarder in your image.

  • After morphology apply findcontours() and boundingRect() for final segmentation.

Source code

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(){

//Load image convert to gray scale and threshold
Mat tmp,thr;
Mat src=imread("test.bmp",1);
blur( src, src, Size( 7, 7 ), Point(-1,-1) );

    //Find biggest contour to segment exact object
    vector< vector <Point> > contours; // Vector for storing contour
    vector< Vec4i > hierarchy;
    int largest_contour_index=0;
    int largest_area=0;
    Mat dst(src.rows,src.cols,CV_8UC1,Scalar::all(0)); //create destination image

     findContours( thr, contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
     for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
       double a=contourArea( contours[i],false);  //  Find the area of contour
       largest_contour_index=i;                //Store the index of largest contour

     drawContours( dst,contours, largest_contour_index, Scalar(255,255,255),CV_FILLED, 8, hierarchy ); // Draw the largest contour using previously stored index.

     //Apply morphological opening operation to eliminate unwanted region.
     Size kernalSize (7,100); //kernal size may change for differnt image
     Mat element = getStructuringElement (MORPH_RECT, kernalSize, Point(1,1)  );
     morphologyEx( dst, dst, MORPH_OPEN, element );

     //find bounding box after morphology.
     findContours( dst, contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image always only one contour
     Rect rect=boundingRect(contours[0]);

     //Crop the rsult
     Mat crop=src(rect);
     rectangle( src, rect, Scalar(0,0,255), 1, 8, 0 );


Result for sample2.bmp

Size kernalSize (7,100);

Source image

image description

Largest contour

image description

After morphology

image description


image description

And for your first image Sample.bmp you need to change the kernel like

Size kernalSize (100,7);

And here is the result I got with the above kernel

image description

edit flag offensive delete link more


Hi Haris, thanks for your sample code. It is working fine. May I ask you one question. How could I choose the corrected "kernalSize" based on these tow images?

zawpai gravatar imagezawpai ( 2013-11-27 22:49:14 -0600 )edit

That may depend on your input image. Suppose if you have to remove the region in four side then you may need to use the kernalSize (100,100);

Haris gravatar imageHaris ( 2013-11-27 23:00:16 -0600 )edit

Hi Haris, Thanks for your help. Now, everything is working fine.

zawpai gravatar imagezawpai ( 2013-11-28 00:55:45 -0600 )edit

You are welcome.

Haris gravatar imageHaris ( 2013-11-28 01:23:20 -0600 )edit

Question Tools


Asked: 2013-11-21 21:50:20 -0600

Seen: 4,923 times

Last updated: Nov 27 '13