8-ШЎЪБА
ДАСТУРИЙ МАҲСУЛОТЛАРНИ ЯРАТИШ ВА
УНИНГ ИСТИҚБОЛЛАРИ
378
ТАСВИРЛАРНИ СEГМEНТЛАШ УСУЛЛАРИ ВА
АЛГОРИТМЛАРИ ТАҲЛИЛИ
М.А. Абдукаримова (катта ўқитувчи, Современный международный
университет(Қирғизистон))
М.Ш. Тўхтаева (магистр, Муҳаммад ал-Хоразмий номидаги ТАТУ)
Ҳозирги кунда тасвирларга рақамли ишлов бериш соҳасида тасвир-
ларни сегментлаш муҳим масала бўлиб ҳисобланади. Сегментациянинг
мақсади тасвирни бўлакларга ажратган ҳолда ишлов бериш жараёнини
соддалаштириш, таҳлил қилишни осонлаштириш ва ишлов бериш тезкорли-
гини ошириш ҳисобланади. Тасвирнинг сегментацияси расмлардаги объект-
лар ва чегараларни ажратиб кўрсатиш учун ишлатилади.
Тасвирларни сегментлаштириш билан боғлиқ амаллар, тасвирларни
қисмларга ажратувчи функсияларни ўрганиш ҳамда бу функсияларни
ишлатиш каби жараёнларни ўз ичига олади. Тасвирлар сегментацияси бу
тасвирни нуқталар бўйича ўхшаш хусусиятлари (ёки белгилар) бўйича
қисмларга бўлишни назарда тутади. Белгилар 2 турга бўлинади: табиий ва
сунъий. Табиий белгилар тасвирни таҳлил қилиш орқали аниқланади, сунъий
белгилар эса махсус ҳисоблашлар натижасида аниқланади. Табиий
белгиларга мисол сифатида тасвирдаги объектнинг тузилиши, текстураси,
ёруғлигини олиш мумкин. Сунъий белгиларга ёруғликнинг тақсимланиш
гистограммаси, спектр ва бошқаларни олиш мумкин.
Тадқиқот натижалари шуни кўрсатадики, тасвирни сегментация қилиш
усулларига ёруғлик бўйича сегментация, ранглар координатаси бўйича
сегментация, контурлар бўйича сегментация, тасвир тузилиши бўйича
сегментация алгоритмлари киради.
Тасвирни қисмларга ажратиш усули асосида сегментлаштиришда
тасвирлар ўзаро кесишмайдиган блокларга ажратилади ва бу блоклар
тавсифларга кўра ўхшашликка текширилади. Яримтонлик тасвирларни
қисмларга ажратиш усули учун сегментлашнинг
qtdecomp
функсияси
ёрдамида амалга оширилади. Функциянинг кўринишини куйидаги
кўринишда тавсивлаш мумкин:
A = qtdecomp(I, threshold ,mindim) qtdecomp
функсияси яримтонлик
тасвирлар сегментациясини қисмларга ажратиш методи орқали амалга
оширилади.
qtdecomp
функсиясида ҳар бир блок бир хил ўлчамли 4 блокка
ажратилади. Алгоритмнинг 1-қадамида бутун тасвир битта блок деб
ҳисобланади. Қаторлар ва устунлари сони тоқ бўлган блокни 4 та тенг
ўлчамли блокларга ажратиб бўлмайди ва бундай блок энг кичик ўлчовли
блок ҳисобланади. Бундан ташқари дастурлаш тилларида тасвирларни бир
неча блокларга ажратган ҳолда сегментлаш алгоритмлари мавжуд.
379
-
Meanshift алгоритми.Meanshift
ўхшаш хусусиятларга эга бўлган
объэктларни гуруҳларга ажратади. Ўхшаш хусусиятларга эга пикселларни
битта сегментга бирлаштириш масаласини ечади. Ушбу алгоритм python
дастурлаш тилида қуйидагича функция кўринишида фойдаланилади:
%matplotlib inline
import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
from sklearn.datasets.samples_generator import make_blobs
centers = [[3,3,3],[4,5,5],[3,10,10]]
X, _ = make_blobs(n_samples = 700, centers = centers, cluster_std =
0.5)
plt.scatter(X[:,0],X[:,1])
plt.show()
-
FloodFill алгоритми.
Бу алгоритм тасвирнинг бир ҳил рангдаги
ҳудудларини аниқлаш имконини беради. Бунда бошланғич пикселни танлаш
ва қўшни пикселларнинг рангини аслига ўзгартириш оралиғи белгиланади.
Алгоритмда пикселлар белгиланган диапазонга тўғри келадиган бўлса,
сегментланган қисмлар бир хил ранг билан тўлдирилади. Сегментлаш
якунида маълум бир ранг ва унинг майдони пиксел билан тўлдирилган
сегмент шаклланади. Pythonда функция кўринишида қуйидагича:
def
fillhole
(
input_image
):
im_flood_fill
=
input_image
.
copy
()
h
,
w
=
input_image
.
shape
[:
2
]
mask
=
np
.
zeros
((
h
+
2
,
w
+
2
),
np
.
uint8
)
im_flood_fill
=
im_flood_fill
.
astype
(
"uint8"
)
cv
.
floodFill
(
im_flood_fill
,
mask
,
(
0
,
0
),
255
)
im_flood_fill_inv
=
cv
.
bitwise_not
(
im_flood_fill
)
img_out
=
input_image
|
im_flood_fill_inv
return
img_out
- GrabCut алгоритми
. Бу сегментлаш усули объэктни танлашнинг
интерактив алгоритми бўлиб, алгоритм ишлаши учун объэктни тўртбурчак
шаклда кесимларга ажратиш билан фоннинг бир қисмини ёпиш кифоя.
Шундан сўнг объэкт автоматик равишда сегментланади:
def
run_grabcut
(
img_orig
,
rect_final
):
mask
=
np
.
zeros
(
img_orig
.
shape
[:
2
],
np
.
uint8
)
x
,
y
,
w
,
h
=
rect_final
mask
[
y
:
y
+
h
,
x
:
x
+
w
]
=
1
bgdModel
=
np
.
zeros
((
1
,
65
),
np
.
float64
)
fgdModel
=
np
.
zeros
((
1
,
65
),
np
.
float64
)
cv2
.
grabCut
(
img_orig
,
mask
,
rect_final
,
bgdModel
,
fgdModel
,
5
,
cv2
.
GC_INIT_WITH_RECT
)
mask2
=
np
.
where
((
mask
==
2
)|(
mask
==
0
),
0
,
1
).
astype
(
'uint8'
)
img_orig
=
img_orig
*
mask2
[:,:,
np
.
newaxis
]
cv2
.
imshow
(
'Output'
,
img_orig
)
Бу алгоритмлар тасвирларни сегментлашда юқори аниқликда натижа
берувчи алгоритмлар ҳисобланади. Шундай қилиб, сегментациялаш
алгоритмлари аниқ мақсадга йўналтирилган вазифа асосида танланиши
керак.
380
Do'stlaringiz bilan baham: |