В настоящее время я работаю над реализацией алгоритма порога, называемого Bradley Adaptive Thresholding
.
Я следовал в основном по двум ссылкам, чтобы понять, как реализовать этот алгоритм. Я также успешно смог реализовать два других алгоритма пороговых значений, главным образом, метод Оцу и сбалансированный порог гистограммы.
Вот две ссылки, по которым я следовал, чтобы создать алгоритм Bradley Adaptive Thresholding
.
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.420.7883&rep=rep1&type=pdf
Пример Брэдли с адаптивным порогом Github
Вот раздел моего исходного кода на Python
где я запускаю алгоритм и сохраняю изображение. Я использую Python Imaging Library
и никаких других инструментов, чтобы выполнить то, что я хочу сделать.
def get_bradley_binary(inp_im):
w, h = inp_im.size
s, t = (w / 8, 0.15)
int_im = Image.new('L', (w, h))
out_im = Image.new('L', (w, h))
for i in range(w):
summ = 0
for j in range(h):
index = j * w + i
summ += get_pixel_offs(inp_im, index)
if i == 0:
set_pixel_offs(int_im, index, summ)
else:
temp = get_pixel_offs(int_im, index - 1) + summ
set_pixel_offs(int_im, index, temp)
for i in range(w):
for j in range(h):
index = j * w + i
x1,x2,y1,y2 = (i-s/2, i+s/2, j-s/2, j+s/2)
x1 = 0 if x1 < 0 else x1
x2 = w - 1 if x2 >= w else x2
y1 = 0 if y1 < 0 else y1
y2 = h - 1 if y2 >= h else y2
count = (x2 - x1) * (y2 - y1)
a1 = get_pixel_offs(int_im, y2 * w + x2)
a2 = get_pixel_offs(int_im, y1 * w + x2)
a3 = get_pixel_offs(int_im, y2 * w + x1)
a4 = get_pixel_offs(int_im, y1 * w + x1)
summ = a1 - a2 - a3 + a4
temp = get_pixel_offs(inp_im, index)
if temp * count < summ * (1.0 - t):
set_pixel_offs(out_im, index, 0)
else:
set_pixel_offs(out_im, index, 255)
return out_im
Вот раздел моего кода, который иллюстрирует реализацию этих методов set и get, которые вы раньше не видели.
def get_offs(image, x, y):
return y * image.size[0] + x
def get_xy(image, offs):
return (offs % image.size[0], int(offs / image.size[0]))
def set_pixel_xy(image, x, y, data):
image.load()[x, y] = data
def set_pixel_offs(image, offs, data):
x, y = get_xy(image, offs)
image.load()[x, y] = data
def get_pixel_offs(image, offs):
return image.getdata()[offs]
def get_pixel_xy(image, x, y):
return image.getdata()[get_offs(image, x, y)]
И, наконец, вот входные и выходные изображения. Это те же изображения, которые использовались в оригинальной исследовательской работе в первой ссылке, которую я вам предоставил. Примечание. Выходное изображение почти полностью белое, и его может быть трудно увидеть, но я все равно предоставил его на случай, если кто-то действительно захочет получить его для справки.