图像的卷积

import numpy as np
import os
from PIL import Image


def convolve(image, weight):
    height, width = image.shape
    h, w = weight.shape
    height_new = height - h + 1
    width_new = width - w + 1
    image_new = np.zeros((height_new, width_new), dtype=np.float)
    for i in range(height_new):
        for j in range(width_new):
            image_new[i,j] = np.sum(image[i:i+h, j:j+w] * weight)
    image_new = image_new.clip(0, 255)
    image_new = np.rint(image_new).astype('uint8')
    return image_new

# image_new = 255 * (image_new - image_new.min()) / (image_new.max() - image_new.min())

if __name__ == "__main__":
    A = Image.open("6.son.png", 'r')
    output_path = '.\\Pic\\'
    if not os.path.exists(output_path):
        os.mkdir(output_path)
    a = np.array(A)
    soble_x = np.array(([-1, 0, 1], [-2, 0, 2], [-1, 0, 1]))
    soble_y = np.array(([-1, -2, -1], [0, 0, 0], [1, 2, 1]))
    soble = np.array(([-1, -1, 0], [-1, 0, 1], [0, 1, 1]))
    prewitt_x = np.array(([-1, 0, 1], [-1, 0, 1], [-1, 0, 1]))
    prewitt_y = np.array(([-1, -1,-1], [0, 0, 0], [1, 1, 1]))
    prewitt = np.array(([-2, -1, 0], [-1, 0, 1], [0, 1, 2]))
    laplacian = np.array(([0, -1, 0], [-1, 4, -1], [0, -1, 0]))
    laplacian2 = np.array(([-1, -1, -1], [-1, 8, -1], [-1, -1, -1]))
    weight_list = ('soble_x', 'soble_y', 'soble', 'prewitt_x', 'prewitt_y', 'prewitt', 'laplacian', 'laplacian2')
    print('梯度检测:')
    for weight in weight_list:
        print(weight, 'R')
        R = convolve(a[:, :, 0], eval(weight))
        print('G')
        G = convolve(a[:, :, 1], eval(weight))
        print('B')
        B = convolve(a[:, :, 2], eval(weight))
        I = 255 - np.stack((R, G, B), 2)
        Image.fromarray(I).save(output_path + weight + '.png')

    # X & Y
    print('梯度检测XY:')
    for w in (0, 2):
        weight = weight_list[w]
        print(weight, 'R')
        R = convolve(a[:, :, 0], eval(weight))
        print('G')
        G = convolve(a[:, :, 1], eval(weight))
        print('B')
        B = convolve(a[:, :, 2], eval(weight))
        I1 = np.stack((R, G, B), 2)

        weight = weight_list[w+1]
        print(weight, 'R')
        R = convolve(a[:, :, 0], eval(weight))
        print('G')
        G = convolve(a[:, :, 1], eval(weight))
        print('B')
        B = convolve(a[:, :, 2], eval(weight))
        I2 = np.stack((R, G, B), 2)

        I = 255 - np.maximum(I1, I2)
        Image.fromarray(I).save(output_path + weight[:-2] + '.png')

猜你喜欢

转载自blog.csdn.net/weixin_38241876/article/details/84954045
今日推荐