Obecnie pracuję nad implementacją algorytmu progowania nazwanego Bradley Adaptive Thresholding
.Adaptacyjny algorytm progowania Bradley'a
Podążałem głównie za dwoma linkami, aby dowiedzieć się, jak wdrożyć ten algorytm. Z powodzeniem udało mi się również wdrożyć dwa inne algorytmy progowania, głównie Otsu's Method i Balanced Histogram Thresholding.
Oto dwa łącza, które śledziłem w celu utworzenia algorytmu Bradley Adaptive Thresholding
.
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.420.7883&rep=rep1&type=pdf
Bradley Adaptive Thresholding Github Example
Oto fragment mojego kodu źródłowego w Python
gdzie Używam algorytm i zapisywania obrazu. Używam Python Imaging Library
i żadnych innych narzędzi do wykonania tego, co chcę zrobić.
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
Oto fragment mojego kodu, który ilustruje implementację tych zestawów i metod, których wcześniej nie widziałeś.
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)]
Na koniec przedstawiamy obrazy wejściowe i wyjściowe. Są to te same obrazy, które są używane w oryginalnym artykule badawczym w pierwszym linku, który ci podałem. Uwaga: Obraz wyjściowy jest prawie całkowicie biały i może być trudny do zobaczenia, ale mimo to dostarczyłem go na wypadek, gdyby ktoś chciał go mieć jako punkt odniesienia.
Co nie działa, prawidłowe generowanie obrazu wyjściowego? Czy masz jakieś nie-wizualne testy? – Ashalynd
Tak, poprawne generowanie obrazu wyjściowego nie działa, użyłem dokładnie tego samego obrazu, którego używał papier badawczy do jego testu, a obraz wyjściowy jest całkowicie biały i nie wygląda dokładnie tak, jak obraz wyjściowy artykułu badawczego.Jeśli chodzi o testy nie wizualne, nie jestem pewien, co masz na myśli. –