mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-24 05:21:09 +00:00
convolve and sobel (#971)
* add gaussian filter algorithm and lena.jpg * add img_convolve algorithm and sobel_filter
This commit is contained in:
parent
32d5c1a9b2
commit
e2d9953952
49
digital_image_processing/filters/convolve.py
Normal file
49
digital_image_processing/filters/convolve.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# @Author : lightXu
|
||||||
|
# @File : convolve.py
|
||||||
|
# @Time : 2019/7/8 0008 下午 16:13
|
||||||
|
from cv2 import imread, cvtColor, COLOR_BGR2GRAY, imshow, waitKey
|
||||||
|
from numpy import array, zeros, ravel, pad, dot, uint8
|
||||||
|
|
||||||
|
|
||||||
|
def im2col(image, block_size):
|
||||||
|
rows, cols = image.shape
|
||||||
|
dst_height = cols - block_size[1] + 1
|
||||||
|
dst_width = rows - block_size[0] + 1
|
||||||
|
image_array = zeros((dst_height * dst_width, block_size[1] * block_size[0]))
|
||||||
|
row = 0
|
||||||
|
for i in range(0, dst_height):
|
||||||
|
for j in range(0, dst_width):
|
||||||
|
window = ravel(image[i:i + block_size[0], j:j + block_size[1]])
|
||||||
|
image_array[row, :] = window
|
||||||
|
row += 1
|
||||||
|
|
||||||
|
return image_array
|
||||||
|
|
||||||
|
|
||||||
|
def img_convolve(image, filter_kernel):
|
||||||
|
height, width = image.shape[0], image.shape[1]
|
||||||
|
k_size = filter_kernel.shape[0]
|
||||||
|
pad_size = k_size//2
|
||||||
|
# Pads image with the edge values of array.
|
||||||
|
image_tmp = pad(image, pad_size, mode='edge')
|
||||||
|
|
||||||
|
# im2col, turn the k_size*k_size pixels into a row and np.vstack all rows
|
||||||
|
image_array = im2col(image_tmp, (k_size, k_size))
|
||||||
|
|
||||||
|
# turn the kernel into shape(k*k, 1)
|
||||||
|
kernel_array = ravel(filter_kernel)
|
||||||
|
# reshape and get the dst image
|
||||||
|
dst = dot(image_array, kernel_array).reshape(height, width)
|
||||||
|
return dst
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# read original image
|
||||||
|
img = imread(r'../image_data/lena.jpg')
|
||||||
|
# turn image in gray scale value
|
||||||
|
gray = cvtColor(img, COLOR_BGR2GRAY)
|
||||||
|
# Laplace operator
|
||||||
|
Laplace_kernel = array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
|
||||||
|
out = img_convolve(gray, Laplace_kernel).astype(uint8)
|
||||||
|
imshow('Laplacian', out)
|
||||||
|
waitKey(0)
|
31
digital_image_processing/filters/sobel_filter.py
Normal file
31
digital_image_processing/filters/sobel_filter.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# @Author : lightXu
|
||||||
|
# @File : sobel_filter.py
|
||||||
|
# @Time : 2019/7/8 0008 下午 16:26
|
||||||
|
import numpy as np
|
||||||
|
from cv2 import imread, cvtColor, COLOR_BGR2GRAY, imshow, waitKey
|
||||||
|
from digital_image_processing.filters.convolve import img_convolve
|
||||||
|
|
||||||
|
|
||||||
|
def sobel_filter(image):
|
||||||
|
kernel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
|
||||||
|
kernel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
|
||||||
|
|
||||||
|
dst_x = img_convolve(image, kernel_x)
|
||||||
|
dst_y = img_convolve(image, kernel_y)
|
||||||
|
dst = np.sqrt((np.square(dst_x)) + (np.square(dst_y))).astype(np.uint8)
|
||||||
|
degree = np.arctan2(dst_y, dst_x)
|
||||||
|
return dst, degree
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# read original image
|
||||||
|
img = imread('../image_data/lena.jpg')
|
||||||
|
# turn image in gray scale value
|
||||||
|
gray = cvtColor(img, COLOR_BGR2GRAY)
|
||||||
|
|
||||||
|
sobel, d = sobel_filter(gray)
|
||||||
|
|
||||||
|
# show result images
|
||||||
|
imshow('sobel filter', sobel)
|
||||||
|
imshow('sobel degree', d)
|
||||||
|
waitKey(0)
|
Loading…
Reference in New Issue
Block a user