Пример #1
0
def alphaTrimmedMeanFilter(image, padding_type, kernel_size, trim_factor):
    # TODO: Add check that trim factor is an integer (between 0 and (filtersize^2 - 1) /2)
    log.debug("Applying alpha trimmed mean filter")
    log.info("Selected padding type is - {}".format(padding_type))
    log.info("Chosen kernel size is - {}".format(kernel_size))

    padded_image = cv.copyMakeBorder(image, kernel_size // 2, kernel_size // 2,
                                     kernel_size // 2, kernel_size // 2,
                                     padding_type)

    log.debug("Scanning the image and sorting each neighborhood")
    width, height = image.shape
    post_filter_image = np.zeros((width, height))
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=padded_image,
                                               row=row + kernel_size // 2,
                                               col=col + kernel_size // 2,
                                               neighborhood_size=kernel_size)
            sorted_neighborhood = neighborhood.flatten()
            sorted_neighborhood = np.sort(sorted_neighborhood)
            post_filter_image[row][col] = np.sum(sorted_neighborhood[trim_factor:-trim_factor]) \
                                          / (len(sorted_neighborhood) - 2 * trim_factor)
    log.debug("Finished scanning the image and sorting each neighborhood")

    log.debug("Finished applying alpha trimmed mean filter")
    return post_filter_image
Пример #2
0
def geometricMeanFilter(image, padding_type, kernel_size):
    log.debug("Applying geometric mean filter")
    log.info("Selected padding type is - {}".format(padding_type))
    log.info("Chosen kernel size is - {}".format(kernel_size))

    padded_image = cv.copyMakeBorder(image, kernel_size // 2, kernel_size // 2,
                                     kernel_size // 2, kernel_size // 2,
                                     padding_type)
    padded_normalized_image = cv.normalize(padded_image, None, 1, 0,
                                           cv.NORM_MINMAX, cv.CV_32F)

    log.debug(
        "Scanning the image and calculating the geometric mean for each neighborhood"
    )
    width, height = image.shape
    post_filter_image = np.zeros((width, height))
    geometric_constant = np.power(float(kernel_size), -2)
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=padded_normalized_image,
                                               row=row + kernel_size // 2,
                                               col=col + kernel_size // 2,
                                               neighborhood_size=kernel_size)
            product = np.prod(neighborhood)
            post_filter_image[row][col] = np.power(product, geometric_constant)
    log.debug(
        "Finished scanning the image and calculating the geometric mean for each neighborhood"
    )

    return_image = cv.normalize(post_filter_image, None, 255, 0,
                                cv.NORM_MINMAX, cv.CV_8UC1)

    log.debug("Finished applying geometric mean filter")
    return return_image
Пример #3
0
def minmaxFilter(image, padding_type, kernel_size, min_or_max):
    log.debug("Applying min/max filter")
    log.info("Selected padding type is - {}".format(padding_type))
    log.info("Chosen kernel size is - {}".format(kernel_size))

    options = {"min": np.min, "max": np.max}

    padded_image = cv.copyMakeBorder(image, kernel_size // 2, kernel_size // 2,
                                     kernel_size // 2, kernel_size // 2,
                                     padding_type)

    log.debug("Scanning the image and sorting each neighborhood")
    log.info("Selected option (min/max) is - {}".format(min_or_max))
    width, height = image.shape
    post_filter_image = np.zeros((width, height))
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=padded_image,
                                               row=row + kernel_size // 2,
                                               col=col + kernel_size // 2,
                                               neighborhood_size=kernel_size)
            post_filter_image[row][col] = options[min_or_max](neighborhood)
    log.debug("Finished scanning the image and sorting each neighborhood")

    log.debug("Finished applying min/max filter")
    return post_filter_image
Пример #4
0
def medianFilter(image, padding_type, kernel_size):
    log.debug("Applying median filter")
    log.info("Selected padding type is - {}".format(padding_type))
    log.info("Chosen kernel size is - {}".format(kernel_size))

    padded_image = cv.copyMakeBorder(image, kernel_size // 2, kernel_size // 2,
                                     kernel_size // 2, kernel_size // 2,
                                     padding_type)

    log.debug("Scanning the image and sorting each neighborhood")
    width, height = image.shape
    post_filter_image = np.zeros((width, height))
    median_constant = np.power(kernel_size, 2) // 2
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=padded_image,
                                               row=row + kernel_size // 2,
                                               col=col + kernel_size // 2,
                                               neighborhood_size=kernel_size)
            sorted_neighborhood = neighborhood.flatten()
            sorted_neighborhood = np.sort(sorted_neighborhood)
            post_filter_image[row][col] = sorted_neighborhood[median_constant]
    log.debug("Finished scanning the image and sorting each neighborhood")

    log.debug("Finished applying median filter")
    return post_filter_image
def edgeDetectionMarrHildreth(image, padding_type1, padding_type2,
                              padding_type3, kernel_size, sigma,
                              threshold_value):
    log.debug("Performing edge detection using Marr-Hildreth model (LoG)")
    log.info("Chosen kernel size is - {}".format(kernel_size))
    log.info("Selected deviation (to be used in the Gaussian filter) is - {}".
             format(sigma))

    # Step I - Smooth the image with a Gaussian low-pass kernel.
    post_gaussian_filter = gaussianFilter(image=image,
                                          border_type=padding_type1,
                                          kernel_size=kernel_size,
                                          sigma=sigma)

    # Step II - Compute the Laplacian of the image resulting from step I.
    post_laplacian_filter = laplacianGradientExtended(
        image=post_gaussian_filter,
        padding_type=padding_type2,
        diagonal_terms=True,
        contrast_stretch=False,
        override=True)

    post_filter_array = cv.copyMakeBorder(post_laplacian_filter, 1, 1, 1, 1,
                                          padding_type3)

    # Step III - Find the zero-crossing of the image from step II.
    log.debug(
        "Performing zero crossing for the post Gaussian-Laplacian filters")
    log.info("Selected threshold is - {}".format(threshold_value))
    width, height = image.shape
    return_array = np.zeros((width, height))
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=post_filter_array,
                                               row=row + 1,
                                               col=col + 1,
                                               neighborhood_size=3)
            return_array[row][col] = zeroCrossing(
                neighborhood=neighborhood, threshold_value=threshold_value)

    return_array = cv.convertScaleAbs(return_array)

    log.debug("Finished performing edge detection using Marr-Hildreth model")
    return return_array
Пример #6
0
def contraHarmonicMeanFilter(image, padding_type, kernel_size, order):
    log.debug("Applying contra harmonic mean filter")
    log.info("Selected padding type is - {}".format(padding_type))
    log.info("Chosen kernel size is - {}".format(kernel_size))

    padded_image = cv.copyMakeBorder(image, kernel_size // 2, kernel_size // 2,
                                     kernel_size // 2, kernel_size // 2,
                                     padding_type)
    padded_normalized_image = cv.normalize(padded_image, None, 1, 0,
                                           cv.NORM_MINMAX, cv.CV_32F)

    log.debug(
        "Scanning the image and calculating the contra harmonic mean for each neighborhood"
    )
    log.info("Selected order is - {}".format(order))
    width, height = image.shape
    post_filter_image = np.zeros((width, height))
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=padded_normalized_image,
                                               row=row + kernel_size // 2,
                                               col=col + kernel_size // 2,
                                               neighborhood_size=kernel_size)
            denominator = np.sum(np.power(neighborhood, order))
            if denominator == 0 is True:
                post_filter_image[row][col] = 1
                continue
            numerator = np.sum(np.power(neighborhood, order + 1))
            post_filter_image[row][col] = numerator / denominator
    log.debug(
        "Finished scanning the image and calculating the geometric mean for each neighborhood"
    )

    return_image = cv.normalize(post_filter_image, None, 255, 0,
                                cv.NORM_MINMAX, cv.CV_8UC1)

    log.debug("Finished applying contra harmonic mean filter")
    return return_image
Пример #7
0
def midpointFilter(image, padding_type, kernel_size):
    log.debug("Applying midpoint filter")
    log.info("Selected padding type is - {}".format(padding_type))
    log.info("Chosen kernel size is - {}".format(kernel_size))

    padded_image = cv.copyMakeBorder(image, kernel_size // 2, kernel_size // 2,
                                     kernel_size // 2, kernel_size // 2,
                                     padding_type)

    log.debug("Scanning the image and sorting each neighborhood")
    width, height = image.shape
    post_filter_image = np.zeros((width, height))
    for row in range(width):
        for col in range(height):
            neighborhood = extractNeighborhood(matrix=padded_image,
                                               row=row + kernel_size // 2,
                                               col=col + kernel_size // 2,
                                               neighborhood_size=kernel_size)
            post_filter_image[row][col] = 0.5 * (np.min(neighborhood) +
                                                 np.max(neighborhood))
    log.debug("Finished scanning the image and sorting each neighborhood")

    log.debug("Finished applying midpoint filter")
    return post_filter_image