简体   繁体   中英

Image Processing Outlines

I'm writing a program that does basic image processing.

Keep in mind that the images are in grayscale, not RGB, also, I'm fairly new to Python, so an explanation of what I'm doing wrong/right would be incredibly helpful.

I'm trying to write an outline algorithm that follows this set of rules:

All light pixels in the original must be white in the outline image. All dark pixels on the edges of the image must be black in the outline image. If a pixel that is not on an edge of the image is dark and all of the 8 surrounding pixels are dark, this pixel is on the inside of a shape and must be white in the outline image. All other dark pixels must be black in the outline image.

So far I have this:

def outlines(image):
    """
    Finds the outlines of shapes in an image.  The parameter must be
    a two-dimensional list of pixels.  The return value is another
    two-dimensional list of pixels which describes an image showing
    outlines of the shapes in the original image.  Each pixel in the
    return value will be either black (0) or white (255).
    """
    height=len(image)
    width=len(image[0])
    new_image=[]
    for r in range(height):
        new_row=[]
        index=0
        for c in range(width):
            if image[r][c]>128:
                new_row.append(255)
            if image[r][c]<=128:
                new_row.append(0])
        new_image.append(new_row)

Can someone show me how to implement the algorithm into my outlines function?

Thanks in advance. Edit: This is an assignment for my University Comp Sci class, I'm not asking for someone to do my homework, rather because I've virtually no idea what the next step is. Edit2: If someone could explain to me a simple edge detection function that is similar to the algorithm I need to create I would appreciate it.

In addition to check if your pixel is dark or clear, you should also check, when dark, if the rest of pixels around are also dark in order to make that point white instead.

Check this function and try to use it for that purpose:

def all_are_dark_around(image, r, c):
    # range gives the bounds [-1, 0, 1]
    # you could use the list directly. Probably better for this especific case
    for i in range(-1,2):              
        for j in range(-1,2):
            # if the pixel is clear return False.
            # note that image[r+0][c+0] is always dark by definition
            if image[r+i][c+j] <= 128:  
                return False
    #the loop finished -> all pixels in the 3x3 square were dark
    return True

Advices:

  1. note that you should never check image[r][c] when r or c are equal to 0 or to height or width . That is, when the checked pixel is in the border because in this case there is at least one side where there is no adjacent pixel to look at in the image and you will get an IndexError
  2. don't expect this code to work directly and to be the best code on terms of efficiency or good style. This is a hint for your homework. You should do it. So look at the code, take your time ( optimally it should be equal or longer than the time it took to me to write the function ), understand how it works and adapt it to your code fixing any exceptions and border situations you encounter in the way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM