저는 파이썬에서 sobel 연산자를 구현하고 시각화하려고합니다. 그러나, 나는 그것을하는 방법에 고투하고있다. 현재 각 픽셀에 대한 그래디언트를 계산하는 다음 코드가 있습니다.파이썬에서 sobel 그래디언트 시각화하기
from PIL import Image
import math
def run():
try:
image = Image.open("brick-wall-color.jpg")
image = image.convert('LA')
apply_sobel_masks(image)
except RuntimeError, e:
print e
def apply_sobel_masks(image):
gx = [
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]
]
gy = [
[1, 2, 1],
[0, 0, 0],
[-1, -2, -1]
]
width, height = image.size
for y in range(0, height):
for x in range(0, width):
gradient_y = (
gy[0][0] * get_pixel_safe(image, x - 1, y - 1, 0) +
gy[0][1] * get_pixel_safe(image, x, y - 1, 0) +
gy[0][2] * get_pixel_safe(image, x + 1, y - 1, 0) +
gy[2][0] * get_pixel_safe(image, x - 1, y + 1, 0) +
gy[2][1] * get_pixel_safe(image, x, y + 1, 0) +
gy[2][2] * get_pixel_safe(image, x + 1, y + 1, 0)
)
gradient_x = (
gx[0][0] * get_pixel_safe(image, x - 1, y - 1, 0) +
gx[0][2] * get_pixel_safe(image, x + 1, y - 1, 0) +
gx[1][0] * get_pixel_safe(image, x - 1, y, 0) +
gx[1][2] * get_pixel_safe(image, x + 1, y, 0) +
gx[2][0] * get_pixel_safe(image, x - 1, y - 1, 0) +
gx[2][2] * get_pixel_safe(image, x + 1, y + 1, 0)
)
print "Gradient X: " + str(gradient_x) + " Gradient Y: " + str(gradient_y)
gradient_magnitude = math.sqrt(pow(gradient_x, 2) + pow(gradient_y, 2))
image.putpixel((x, y), #tbd)
image.show()
def get_pixel_safe(image, x, y, layer):
try:
return image.getpixel((x, y))[layer]
except IndexError, e:
return 0
run()
이제 gradient_magnitude는 흔히 0-255 범위 밖의 값입니다. 990.0, 1002.0, 778 등
그래서 내가하고 싶은 것은 그 그래디언트를 시각화하는 것입니다. 대부분의 온라인 리소스는 그래디언트 각도와 크기를 계산하지만 이미지에서이를 나타내는 방법은 언급하지 않습니다.
시도의 정규화 값의 최대 및 최소값을 이용하여 255까지 그라디언트 크기 이미지, 즉'displayableGradMagnitude = 255 * (gradMagnitude - minGradMagnitude)/(maxGradMagnitude - minGradMagnitude)'. – saurabheights
감사합니다. 완벽하게 작동했습니다. 어쩌면 답으로 게시하여 신용을 줄 수 있습니다. – fbailey
Solbel 회선 커널은 분리 가능합니다. [-1,0,1]과 함께 컨볼 루션을 적용 할 수 있으며 결과에 [1,2,1]의 전치와 함께 두 번째 컨볼 루션을 적용 할 수 있습니다. 항상 더 효율적이며 구현하기도 쉽습니다. 두 작업의 순서는 부적합합니다. y 미분은 두 개의 커널을 전 환하여 계산됩니다. –