применение фильтра Собеля к изображению

Я пытаюсь использовать фильтр Собеля на изображении стены, но это не работает.

Мой код:

im=scipy.misc.imread('IMG_1479bis.JPG')
im = im.astype('int32')
dx=ndimage.sobel(im,1)
dy=ndimage.sobel(im,0)
mag=np.hypot(dx,dy)
mag*=255.0/np.max(mag)
cv2.imshow('sobel.jpg', mag)

введите здесь описание изображения

Я действительно не понимаю, где моя ошибка. Любая помощь будет оценена! Заранее спасибо !


person Pauline1006    schedule 19.05.2015    source источник
comment
Вы получаете какие-либо ошибки или ничего не происходит?   -  person Scott    schedule 20.05.2015
comment
...это не работает. Пожалуйста, объясните, что это значит. Если вы получили сообщение об ошибке, покажите полную трассировку. Если результат не соответствует вашим ожиданиям, покажите, что вы получили, и объясните, что вы ожидали.   -  person Warren Weckesser    schedule 20.05.2015


Ответы (1)


К этому изображению сложно применить простое обнаружение краев из-за текстур камня и бетона. Текстура делает это почти так, как если бы у вас было очень зашумленное изображение, к которому вы применяете первую производную. Вы получите много маленьких нежелательных краев.

Вот ваш код работает (не приводит к ошибке):

import scipy.ndimage as nd
import numpy as np
import matplotlib.pyplot as plt

im = scipy.ndimage.imread('ygqCd.jpg', True)
im = im.astype('int32')
dx = nd.sobel(im,1)
dy = nd.sobel(im,0)
mag = np.hypot(dx,dy)
mag *= 255.0/np.max(mag) 

fig, ax = plt.subplots()
ax.imshow(mag, cmap = 'gray')
plt.xticks([]), plt.yticks([])
plt.show()

Строка чтения изображения scipy.ndimage.imread('ygqCd.jpg', True) преобразуется в оттенки серого. См. ndimage.imread.

И выходное изображение (как и ожидалось, очень шумное): введите здесь описание изображения

Я больше знаком с cv2. Я немного поиграл с изображением с помощью cv2.sobel и медианной фильтрации перед применением sobel. Вот результаты, не потрясающие, но хорошее начало:

введите здесь описание изображения

и код для генерации изображений:

import cv2
import numpy as np
from matplotlib import pyplot as plt

def interval_mapping(image, from_min, from_max, to_min, to_max):
    from_range = from_max - from_min
    to_range = to_max - to_min
    scaled = np.array((image - from_min) / float(from_range), dtype=float)
    return to_min + (scaled * to_range)

img = cv2.imread('ygqCd.jpg', 0)
blurred_img = cv2.medianBlur(img, 11)

s_mask = 17

sobelx = np.abs(cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=s_mask))
b_sobelx = np.abs(cv2.Sobel(blurred_img, cv2.CV_64F, 1, 0, ksize=s_mask))
sobelx = interval_mapping(sobelx, np.min(sobelx), np.max(sobelx), 0, 255)
b_sobelx = interval_mapping(b_sobelx, np.min(sobelx), np.max(sobelx), 0, 255)

sobely = np.abs(cv2.Sobel(img,cv2.CV_64F,0,1,ksize=s_mask))
sobely = interval_mapping(sobely, np.min(sobely), np.max(sobely), 0, 255)
b_sobely = np.abs(cv2.Sobel(blurred_img, cv2.CV_64F, 0, 1, ksize=s_mask))
b_sobely = interval_mapping(b_sobely, np.min(sobely), np.max(sobely), 0, 255)

sobel_xy = 0.5 * sobelx + 0.5 * sobely
b_sobel_xy = 0.5 * b_sobelx + 0.5 * b_sobely

fig = plt.figure(figsize=(10, 14))
plt.subplot(3,2,1),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(3,2,2),plt.imshow(b_sobelx,cmap = 'gray')
plt.title('Blurred Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(3,2,3),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.subplot(3,2,4),plt.imshow(b_sobely,cmap = 'gray')
plt.title('Blurred Sobel Y'), plt.xticks([]), plt.yticks([])
plt.subplot(3,2,5),plt.imshow(sobel_xy,cmap = 'gray')
plt.title('Sobel XY'), plt.xticks([]), plt.yticks([])
plt.subplot(3,2,6),plt.imshow(b_sobel_xy,cmap = 'gray')
plt.title('Blurred Sobel XY'), plt.xticks([]), plt.yticks([])
plt.tight_layout()

plt.show()
person Scott    schedule 19.05.2015
comment
Большое спасибо за все эти объяснения! - person Pauline1006; 20.05.2015