tags:

views:

310

answers:

5

I'm searching for a program which detects the border of a image, for example I have a square and the program detects the X/Y-Coords

Example:

alt text

A: 

From the sounds of it, you just want a blob extraction algorithm. After that, the lowest/highest values for x/y will give you the coordinates of the corners.

BlueRaja - Danny Pflughoeft
Yes, but I think you need first apply a border detector to distinguish object's inner pixels from object's border pixels.
Andres
Judging from the comments made after my post, it sounds like he has an image like above, and wants the coordinates of the corners of some filled polygon.I guess my next question would be, is it always convex?
BlueRaja - Danny Pflughoeft
A: 

It depends what you want to do with the border, if you are looking at getting just the values of the edges of the region, use an algorithm called the Connected Components Region. You must know the value of the region prior to using the algorithm. This will navigate around the border and collect the outside region. If you are trying to detect just the outside lines get the gradient of the image and it will reveal where the lines are. To do this convolve the image with an edge detection filter such as Prewitt, Sobel, etc.

monksy
+2  A: 

You can use any image processing library such as Opencv. which is in c++ or python. You should look for edge detection functions such as Canny edge detection. Of course this would require some diving into image processing. The example image you gave should be straight forward to detect, how noisy/varied are the images going to be?

Li
Canny would be overkill for an image like that. A simple combination of gradient filters would do what he needed.
monksy
It all depends on what conditions you want to deal with(as mentioned - how noisy is the image going to be)
liza
Given his sample shown in the orignal post canny would be overkill
monksy
A: 

A shape recognition algorithm might help you out, providing it has a solid border of some kind, and the background colour is a solid one.

Chris S
+2  A: 

This is a very simple edge detector. It is suitable for binary images. It just calculates the differences between horizontal and vertical pixels like image.pos[1,1] = image.pos[1,1] - image.pos[1,2] and the same for vertical differences. Bear in mind that you also need to normalize it in the range of values 0..255.

But! if you just need a program, use Adobe Photoshop.

Code written in C#.

public void SimpleEdgeDetection()
{
    BitmapData data = Util.SetImageToProcess(image);
    if (image.PixelFormat != PixelFormat.Format8bppIndexed)
        return;

    unsafe
    {
        byte* ptr1 = (byte *)data.Scan0;
        byte* ptr2;
        int offset = data.Stride - data.Width;
        int height = data.Height - 1;
        int px;

        for (int y = 0; y < height; y++)
        {
            ptr2 = (byte*)ptr1 + data.Stride;
            for (int x = 0; x < data.Width; x++, ptr1++, ptr2++)
            {
                px = Math.Abs(ptr1[0] - ptr1[1]) + Math.Abs(ptr1[0] - ptr2[0]);
                if (px > Util.MaxGrayLevel) px = Util.MaxGrayLevel;
                ptr1[0] = (byte)px;
            }
            ptr1 += offset;
        }
    }
    image.UnlockBits(data);
}

Method from Util Class

static public BitmapData SetImageToProcess(Bitmap image)
{
        if (image != null)
            return image.LockBits(
                new Rectangle(0, 0, image.Width, image.Height),
                ImageLockMode.ReadWrite,
                image.PixelFormat);

        return null;
}

If you need more explanation or algorithm just ask with more information without being so generalist. Regards

Andres