ниблачный порог - PullRequest
       63

ниблачный порог

1 голос
/ 26 марта 2012

Я пытаюсь реализовать алгоритм определения порога niblack, который использует формулу:

pixel = ( pixel >  mean + k * standard_deviation ) ? object : background

, где k имеет стандартное значение 0. Может кто-нибудь сказать, пожалуйста, как реализовать это в Matlab? Я не могу понять, как это сделать

Ответы [ 3 ]

4 голосов
/ 27 марта 2012

Сила Matlab заключается в матричных операциях, поэтому вы можете многое сделать без единого цикла for. Код ниже делает то, что вам нужно.

% define parameters
imgname = 'rice.png'; % matlab's image
filt_radius = 25; % filter radius [pixels]
k_threshold = 0.2; % std threshold parameter
%% load the image
X = double(imread(imgname)); 
X = X / max(X(:)); % normalyze to [0, 1] range
%% build filter
fgrid = -filt_radius : filt_radius;
[x, y] = meshgrid(fgrid);
filt = sqrt(x .^ 2 + y .^ 2) <= filt_radius;
filt = filt / sum(filt(:));
%% calculate mean, and std
local_mean = imfilter(X, filt, 'symmetric');
local_std = sqrt(imfilter(X .^ 2, filt, 'symmetric'));
%% calculate binary image
X_bin = X >= (local_mean + k_threshold * local_std);
%% plot
figure; ax = zeros(4,1);
ax(1) = subplot(2,2,1); imshow(X); title('original image');
ax(2) = subplot(2,2,2); imshow(X_bin); title('binary image');
ax(3) = subplot(2,2,3); imshow(local_mean); title('local mean');
ax(4) = subplot(2,2,4); imshow(local_std); title('local std');
linkaxes(ax, 'xy');

enter image description here

2 голосов
/ 27 июля 2014

Я хотел бы сказать, что это не алгоритм Niblack, а реализация, которая дает лучший результат. Я не знаю, где эта реализация потерпит неудачу, но я попытался преобразовать изображение в двоичную форму выше, и результат, как показано ниже.

Binarized grains

Я разделил изображение на блок 25 * 25 пикселей, а затем использовал глобальное среднее значение 90 и глобальное среднее значение 20. Затем применил бинаризацию Оцу к маленьким окнам.

set_mean = 90
set_sd = 20
mean_block = np.mean(block)
sd_block = np.std(block)
if sd_block > set_sd:
    ret, block = cv2.threshold(block, 0, 255, cv2.THRESH_OTSU)
elif sd_block < set_sd:
    if mean_block > set_mean:
        block[:] = 255 #white
    else:
        block[:] = 0 #black
return block

Если стандартное отклонение (SD) небольшого окна больше установленного, то используется пороговое значение отсу, в зависимости от того, является ли среднее значение большим или меньшим, чем установленное среднее значение, пиксели в окне устанавливаются как черные или белый.

0 голосов
/ 26 марта 2012

Вы можете обработать все изображение: Предполагая, что у вас есть три матрицы: img_in, object, background

flag = img_in >  mean + k * standard_deviation;
img_out = flag .* object + (1 - flag) .* background;
...