
3. Морфологические преобразования бинарных изображений
Предварительно сохраним:
imwrite(db1,'d:\zlabcv\2\h1b.bmp');
Результат морфологических преобразований можно проверить подсчетом суммы всех элементов изображения: она будет равна числу пикселей объекта т.е. равных 1
Выполним "закрытие" дыр...
dm1 =bwmorph(db1, 'close');
... и проверку
[sum(sum(db1)), sum(sum(dm1))];
........................................................
При однократном применении (и рекурсии!) результат незначительный... Но большего, с этим алгоритмом, достичь не получится. почему?
Дополнительно (dm dm) удалим шпуры:
dm1 =bwmorph(dm1, 'spur');
............................................
... и выполним проверку
Визуально, изображения мало отличаются. Например:
№6 (фрагмент)
после бинаризации после закрытия
и удаления шпуров
Тем не менее, в цифрах это заметнее (табл. ***)
-
№
Общее число пикселей со значением 1
(предположительно, пикселей объектов)
после
бинаризации
после
закрытия
после удаления
шпуров
1
159738
159919
159867
2
154416
154280
154256
3
138816
138796
138761
4
156901
156793
156755
5
162568
162536
162486
6
75662
76402
76336
Контрольный вопрос. Объясните, почему число пикселей объекта после закрытия в №№ 1 и 2 — увеличилось, а в №№ 3,4,5 — уменьшилось? ... А после 'spur' все уменьшились? // Подсказка: какие алгоритмы реализует 'close'?
Понятно, что для полноценной обработки, нам необходимо выделить объекты, по какому-либо условию.
Этим условием является связность пикселей объекта и фона.
|
|
[L1,num1]=bwlabel(dm1,4); [L2,num2]=bwlabel(dm2,4); [L3,num3]=bwlabel(dm3,4); [L4,num4]=bwlabel(dm4,4); [L5,num5]=bwlabel(dm5,4); [L6,num6]=bwlabel(dm6,4);
|
|
num указывает количество объектов — связных областей на изображении. Понятно, что нас интересует только один. Но какой именно?.. Решить эту задачу поможет анализ размера "объектов" или спектральный анализ.
p=dm1;L=L1;num=num1;
z=size(dm1); zz=z(1)*z(2);
d11=d1;
for I=1:zz
if L(I)~=1 % 2, 3, 4, 5...
p(I)=0;
end
end
Imshow(p);
dm1(1) |
2 |
dm1(3) = od1 |
4 |
5 |
|
|
|
|
|
dm2(1) |
|
dm2 (3) = od2 |
|
|
|
Повторное
преобразование
|
окончательный вариант |
|
|
|
|
dm6 (6) = od6 |
|
|
|
|
|
|
|
Со вторым объектом dm2 нас ожидает неудача.
Первый же "объект" не позволяет выделить интересующую нас область... Применение к изображению d2 операции "открытие" open, которая может позволить фону соединиться, не дает результата.
Также неэффективна многократная (12), эрозия (рис. ниже).
Неэффективна и бинаризация с другим порогом:
Остается вернуться назад или написать собственный алгоритм. Поэтому:
а) преобразуем исходное цветное в серое
б) выполним уменьшение яркости и контрастирование
в) преобразуем в бинарное...
db2=fbin(d2,0.2);imshow(db2);
...и кажется на этот раз получилось;
г) улучшим (рис. слева)
д) выполнив [L,num]=bwlabel(dm2,4);
видим, что объектов слишком много (98), а нам нужны, только главные. Оценим число пикселей в объектах и выберем только самые большие:
[L,num]=bwlabel(dm2,4);
p=dm2;L=L+1;
z=size(p); zz=z(1)*z(2);
k=zeros(1,num+1);
for I=1:zz
0 |
1 |
2 |
96 |
206291 |
39508 |
68661 |
28491 |
end
Теперь выбрать объект и удалить другие пиксели не составляет труда
Значение 0 соответствует фону, поэтому проверим только 1,2,3 и 96: Объект №3 и есть искомый. Поместим его в таблицу **
Теперь найдем и включим в библиотеку объект с изображения № 6. Вычисления показывают, что (по совпадению) это как раз объект 6 из тех, которые найдены на изображении.
Эти три изображения используем, чтобы выбрать для них подходящее пространство признаков.
Пространство признаков
od1 |
|
|
|
|
|
|
|
|
|
od2 |
|
|
|
|
|
|
|
|
|
od6 |
|
|
|
|
|
|
|
|
|
feat=imfeature(L1,'all')
Распознавание
Методами корреляции
Для множества {x} и образца {x0} вычисляется мера соответствия (коэффициент корреляции Rn):
|x| = |x0| = n
1 Инверсию используют иногда для экономии тонера при печати.