Главная » 2026 » Март » 19 » Sobel, Sharr, Prewitt, Laplacian: сравнение операторов поиска границ
22:56
Sobel, Sharr, Prewitt, Laplacian: сравнение операторов поиска границ

Sobel, Sharr, Prewitt, Laplacian: сравнение операторов поиска границ

При работе с изображением в градациях серого мы имеем дело с матрицей чисел, описывающих яркость пикселя в определенной точке. В каждой точке изображения вектор градиента показывает направление наибольшего увеличения яркости, а его длина — величину изменения яркости. Для точки внутри области с постоянной яркостью вектор будет нулевым. Для вычисления градиента наиболее часто используется фильтр Собеля. Сравним операторы поиска границ Sobel, Sharr, Prewitt и Laplacian.

import math
import numpy as np

def test_sobel(k):
    sum_x = -1 * k[0] + -2 * k[1] + -1 * k[2]
    sum_x += k[6] + 2 * k[7] + k[8]
    sum_y = -1 * k[0] + k[2] + -2 * k[3]
    sum_y += 2 * k[5] + -1 * k[6] + k[8]
    sum_xy = sum_x * sum_x + sum_y * sum_y
    magn = int(math.sqrt(sum_xy))
    print("Sobel: {0} {1} = {2}".format(sum_x, sum_y, magn))

def test_sharr(k):
    sum_x = -3 * k[0] + -10 * k[1] + -3 * k[2]
    sum_x += 3 * k[6] + 10 * k[7] + 3 * k[8]
    sum_y = -3 * k[0] + 3 * k[2] + -10 * k[3]
    sum_y += 10 * k[5] + -3 * k[6] + 3 * k[8]
    sum_xy = sum_x * sum_x + sum_y * sum_y
    magn = int(math.sqrt(sum_xy))
    print("Sharr: {0} {1} = {2}".format(sum_x, sum_y, magn))

def test_prewitt(k):
    sum_x = -1 * k[0] + -1 * k[1] + -1 * k[2]
    sum_x += k[6] + k[7] + k[8]
    sum_y = -1 * k[0] + k[2] + -1 * k[3]
    sum_y += k[5] + -1 * k[6] + k[8]
    sum_xy = sum_x * sum_x + sum_y * sum_y
    magn = int(math.sqrt(sum_xy))
    print("Prewitt: {0} {1} = {2}".format(sum_x, sum_y, magn))

def test_laplacian(k):
    sum_x = k[1] + k[3] + -4 * k[4] + k[5] + k[7]
    print("Laplacian: = {0}".format(sum_x))

def test_edges(k):
    sum_x = -1 * k[0] + -1 * k[1] + -1 * k[2] + -1 * k[3] + 8 * k[4]
    sum_x += -1 * k[5] + -1 * k[6] + -1 * k[7] + -1 * k[8]
    print("Edges: = {0}".format(sum_x))

arr = [
0, 255, 0,
0, 255, 0,
0, 255, 0
]

arr_np = np.array(arr).reshape(3, 3)
print(arr_np)

test_sobel(arr)
test_sharr(arr)
test_prewitt(arr)
test_laplacian(arr)
test_edges(arr)

Одноцветная область:

[[255 255 255]
 [255 255 255]
 [255 255 255]]
Sobel: 0 0 = 0
Sharr: 0 0 = 0
Prewitt: 0 0 = 0
Laplacian: = 0
Edges: = 0

[[128 128 128]
 [128 128 128]
 [128 128 128]]
Sobel: 0 0 = 0
Sharr: 0 0 = 0
Prewitt: 0 0 = 0
Laplacian: = 0
Edges: = 0

[[0 0 0]
 [0 0 0]
 [0 0 0]]
Sobel: 0 0 = 0
Sharr: 0 0 = 0
Prewitt: 0 0 = 0
Laplacian: = 0
Edges: = 0

Граница по вертикали:

[[  0 255 255]
 [  0 255 255]
 [  0 255 255]]
Sobel: 0 1020 = 1020
Sharr: 0 4080 = 4080
Prewitt: 0 765 = 765
Laplacian: = -255
Edges: = 765

[[255 255   0]
 [255 255   0]
 [255 255   0]]
Sobel: 0 -1020 = 1020
Sharr: 0 -4080 = 4080
Prewitt: 0 -765 = 765
Laplacian: = -255
Edges: = 765

[[  0 128 128]
 [  0 128 128]
 [  0 128 128]]
Sobel: 0 512 = 512
Sharr: 0 2048 = 2048
Prewitt: 0 384 = 384
Laplacian: = -128
Edges: = 384

[[128 128   0]
 [128 128   0]
 [128 128   0]]
Sobel: 0 -512 = 512
Sharr: 0 -2048 = 2048
Prewitt: 0 -384 = 384
Laplacian: = -128
Edges: = 384

[[ 0 50 50]
 [ 0 50 50]
 [ 0 50 50]]
Sobel: 0 200 = 200
Sharr: 0 800 = 800
Prewitt: 0 150 = 150
Laplacian: = -50
Edges: = 150

[[ 0 10 10]
 [ 0 10 10]
 [ 0 10 10]]
Sobel: 0 40 = 40
Sharr: 0 160 = 160
Prewitt: 0 30 = 30
Laplacian: = -10
Edges: = 30

[[ 0 15 15]
 [ 0 15 15]
 [ 0 15 15]]
Sobel: 0 60 = 60
Sharr: 0 240 = 240
Prewitt: 0 45 = 45
Laplacian: = -15
Edges: = 45

[[15 30 30]
 [15 30 30]
 [15 30 30]]
Sobel: 0 60 = 60
Sharr: 0 240 = 240
Prewitt: 0 45 = 45
Laplacian: = -15
Edges: = 45

[[15 35 35]
 [15 35 35]
 [15 35 35]]
Sobel: 0 80 = 80
Sharr: 0 320 = 320
Prewitt: 0 60 = 60
Laplacian: = -20
Edges: = 60

Граница по горизонтали:

[[  0   0   0]
 [255 255 255]
 [255 255 255]]
Sobel: 1020 0 = 1020
Sharr: 4080 0 = 4080
Prewitt: 765 0 = 765
Laplacian: = -255
Edges: = 765

[[255 255 255]
 [255 255 255]
 [  0   0   0]]
Sobel: -1020 0 = 1020
Sharr: -4080 0 = 4080
Prewitt: -765 0 = 765
Laplacian: = -255
Edges: = 765

Диагональ:

[[  0   0 255]
 [  0 255 255]
 [255 255 255]]
Sobel: 765 765 = 1081
Sharr: 3315 3315 = 4688
Prewitt: 510 510 = 721
Laplacian: = -510
Edges: = 765

[[255 255 255]
 [255 255   0]
 [255   0   0]]
Sobel: -765 -765 = 1081
Sharr: -3315 -3315 = 4688
Prewitt: -510 -510 = 721
Laplacian: = -510
Edges: = 765

[[255   0   0]
 [255 255   0]
 [255 255 255]]
Sobel: 765 -765 = 1081
Sharr: 3315 -3315 = 4688
Prewitt: 510 -510 = 721
Laplacian: = -510
Edges: = 765

[[255 255 255]
 [  0 255 255]
 [  0   0 255]]
Sobel: -765 765 = 1081
Sharr: -3315 3315 = 4688
Prewitt: -510 510 = 721
Laplacian: = -510
Edges: = 765

Угловые точки:

[[255 255 255]
 [255 255 255]
 [  0 255 255]]
Sobel: -255 255 = 360
Sharr: -765 765 = 1081
Prewitt: -255 255 = 360
Laplacian: = 0
Edges: = 255

[[255 255 255]
 [255 255 255]
 [255   0 255]]
Sobel: -510 0 = 510
Sharr: -2550 0 = 2550
Prewitt: -255 0 = 255
Laplacian: = -255
Edges: = 255

[[255 255 255]
 [255 255 255]
 [255 255   0]]
Sobel: -255 -255 = 360
Sharr: -765 -765 = 1081
Prewitt: -255 -255 = 360
Laplacian: = 0
Edges: = 255

[[30 30 30]
 [30 30 30]
 [30 30  0]]
Sobel: -30 -30 = 42
Sharr: -90 -90 = 127
Prewitt: -30 -30 = 42
Laplacian: = 0
Edges: = 30

Значение 0 не всегда означает одноцветную область!

[[  0 255   0]
 [  0 255   0]
 [  0 255   0]]
Sobel: 0 0 = 0
Sharr: 0 0 = 0
Prewitt: 0 0 = 0
Laplacian: = -510
Edges: = 1530

[[  0   0   0]
 [  0 255   0]
 [  0   0   0]]
Sobel: 0 0 = 0
Sharr: 0 0 = 0
Prewitt: 0 0 = 0
Laplacian: = -1020
Edges: = 2040

[[  0   0   0]
 [255 255 255]
 [  0   0   0]]
Sobel: 0 0 = 0
Sharr: 0 0 = 0
Prewitt: 0 0 = 0
Laplacian: = -510
Edges: = 1530

Концы:

[[  0 255   0]
 [  0 255   0]
 [  0   0   0]]
Sobel: -510 0 = 510
Sharr: -2550 0 = 2550
Prewitt: -255 0 = 255
Laplacian: = -765
Edges: = 1785
Категория: UImage C | Просмотров: 9 | Добавил: unicross | Теги: Sobel, Sharr, Laplacian, Prewitt | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Списки слов [9]
Списки слов и словари
OCR [4]
Оптическое распознавание символов
UImage [2]
Графическая библиотека для Python
UImage C [9]
Графическая библиотека для Python
Программы [4]
Полезные программы
Прочее [3]
Другие темы
Календарь
«  Март 2026  »
Пн Вт Ср Чт Пт Сб Вс
      1
2345678
9101112131415
16171819202122
23242526272829
3031