OpenCV Kütüphanesi ile Görüntü İşleme (Uygulamalı)

Adem Akdogan
11 min readOct 10, 2020

--

*** If you want to read my article in english, please visit Towards Data Science (Practical Image Process with OpenCV)

Görüntü işleme, temel anlamıyla elimizdeki görüntüleri algoritmalar yardımıyla işleyerek bu görüntülerden elde etmek istediğimiz özelliklere doğrudan ulaşmamızı veya bu özellikleri öne çıkartmamızı sağlayan süreçtir. Günümüzde resim veya videoların veri olarak kullanıldığı derin öğrenme yapılarında eğitimin daha başarılı olması için sıkça kullanılan işlemlerdir.

Görüntü İşleme

Görüntü işleme süreci verilerin bilgisayarlar tarafından tanınmasıyla başlar. Görüntü formatındaki veri için öncelikle matris oluşturulur. Resimdeki her bir piksel değeri bu matrise işlenir. Sonuç olarak 200 x 200 boyutundaki bir resim için 200 x 200 boyutunda bir matris oluşturulur. Eğer bu resim renkli ise bu boyut 200x200x3 halini alır (RGB). Görüntü işleme sürecinde yapılan her manipülasyon aslında bir matris işlemidir. Örnek olarak verdiğimiz 200x200 boyutundaki resim üzerinde bir bulanıklaştırma işlemi yapılmak istendiğini varsayalım. Burada belirli bir filtre bütün matris üzerinde gezerek matris elemanlarının tamamının veya bir kısmının üzerinde işlem yapar. Bu işlem sonucunda resmin istenen bölümü veya tamamı bulanık bir hale gelir. Bu durum diğer görüntü işleme süreçleri için de geçerlidir.

Görüntülerin işlenmesine bir çok durumda ihtiyaç duyulmaktıdır [1]. Genellikle bu işlemler derin öğrenme modellerinde kullanılacak olan görüntü formatındaki veriler üzerine uygulanır. Örnek olarak bazı projelerde bu verilerin renkli olmasının eğitime bir etkisi yoktur. Bu gibi durumlarda eğitimi renkli resimler ile gerçekleştirmek, eğitimin daha yavaş ve daha düşük performans ile yapılmasına sebebiyet verir. Görüntü işlemenin en çok kullanıldığı derin öğrenme yapılarından birisi Evrişimsel Sinir Ağlarıdır (Convolutional Neural Network). Bu model içerisinde bulundurduğu Convolutional katmanı ile resim üzerinde eğitim için gerekli olan öznitelikleri belirleyerek, eğitimlerini bu öznitelik matrisleri üzerinden gerçekleştirir (Bu konuyla ilgili araştırma yapanlar için Uygulamalı Evrişimsel Sinir Ağları (Convolutional Neural Network) yazısına buradan ulaşabilirsiniz). Bu noktada eğitim için kullanılacak resimlerin yalnızca belirli bölümlerine odaklanılmasını gerekebilir. Bazı durumlarda resimlerdeki keskin hatlar yerine daha yuvarlak hatların öne çıkması, eğitimin başarısını artırabilir. İşte bu tarz ihtiyaçlar karşısında görüntü işleme teknikleri kullanılmaktadır.

Yukarıda anlatılan durumlar dışında günlük hayatta kullanılan resim optimizasyon programlarının da yaptığı işlemlerin temelinde aynı mantık yatmaktadır. Histogram değerlerinin düzenlenmesi ile tespiti zor olan objelerin net bir şekilde tespit edilmesi sağlanmaktadır. Resimlerdeki kalitenin artırılması, görüntüler üzerinde restorasyonlar yapılması, gürültülerin temizlenmesi gibi bir çok işlem görüntü işleme süreçlerinin içerisinde yer almaktadır.

OpenCV Kütüphanesi ve Uygulamaları

Görüntü işleme için kullanılan en popüler kütüphanelerden birisi OpenCV kütüphanesidir [2]. Çok yaygın olarak kullanılan bu kütüphanenin kullanıcıları arasında Microsoft, Intel, Google, Yahoo gibi büyük şirketler de bulunmaktadır. Java, C++, Python ve Matlab gibi bir çok yazılım dili tarafından kullanılabilmektedir. Bu çalışma kapsamındaki örneklerin tamamı Python dili ile yazılmıştır.

import cv2
from matplotlib import pyplot as plt
import numpy as np

Öncelikle kütüphaneler import edilir. Dikkat edilmesi gereken önemli konu, OpenCV içerisinde her sürümde stabil şekilde çalışmayan bazı fonksiyonlar vardır. Bu fonksiyonlardan bir tanesi imshow fonksiyonudur. Bu fonksiyon yaptığımız işlemler sonucunda resimdeki değişiklikleri görmemizi sağlar. Bu çalışmada bu tarz problemler yaşayan kişiler için de alternatif çözüm olması açısından matplotlib kütüphanesi kullanılacaktır.

Şekil 1. Standart Resim

Yapılacak işlemler yukarıda görülen resim (Şekil 1) üzerine uygulanacaktır. Bu resmin işlenebilmesi için ilk olarak resmi okuma işlemi yapılır.

img_path = "/Users/..../opencv/road.jpeg"
img = cv2.imread(img_path)
print(img.shape)
>>>(960, 1280, 3)

Örnekte kullanılan resmin boyutları 960 x 1280 pikseldir. Okuma işlemi gerçekleştikten sonra boyutlarını yazdırmak istediğimizde 960x1280x3 sonucunu görürüz. Yani resmin boyutları kadar bir matris oluşturuldu ve bu matrise resmin her pikselinin değerleri atandı. Resim renkli olduğu için de RGB’ den gelen 3 boyut vardır.

Şekil 1 de görülen resmi siyah beyaz yapmak istersek,

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

fonksiyonu kullanılır. Bu fonksiyon sonucunda oluşan değişikliği görmek istersek matplotlib içerisinden imshow fonksiyonunu kullanırız.

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray_image)
plt.show()
print(gray_image.shape)
>>>(960, 1280)
Şekil 2. Siyah-Beyaz Resim

Şekil 2 de görüldüğü üzere resmimizi siyah beyaz bir formata getirdik. Boyutlarını kontrol ettiğimizde ise RGB’den kaynaklanan 3 boyutun gittiğinin görebiliriz.

Elde edilen resmin matris değerlerine baktığınızda 0–255 arasında değerlerden oluştuğunu görüyoruz. Bazı durumlarda bu matrisin yalnızca 0 ve 255 değerlerinden oluşmasını isteyebiliriz [3]. Böyle durumlarda threshold fonksiyonu kullanılmaktadır.

(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 20, 255, cv2.THRESH_BINARY)
(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 80, 255, cv2.THRESH_BINARY)
(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 160, 255, cv2.THRESH_BINARY)
(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 200, 255, cv2.THRESH_BINARY)
plt.imshow(blackAndWhiteImage)
plt.show()
Şekil 3. Threshold Uygulanmış Resim

OpenCV içerisindeki threshold fonksiyonunun istediği ilk parametre işlem yapılacak resmin kendisi. Sonrasındaki parametre ise verilecek eşik değer. Üçüncü parametre ise bu eşik değeri geçen matris elemanlarının atanmasını istediğimiz değer. 4 farklı eşik değer ve bu değerlere ait değişiklikler Şekil 3.de görülebilir. İlk resimde (1.Resim) eşik değer 20 olarak belirlendi. 20 üzerindeki bütün değerlere 255 atandı. Kalan değerlerse 0 olarak belirlendi. Bu da yalnızca siyah veya siyaha yakın çok koyu renklerin resimde kalmasını diğer bütün tonların doğrudan beyaz olmasını sağladı. 2 ve 3. resimlerde 80 ve 160 gibi ara değerler verildi. Son olarak 4.resimde ise 200 belirlendi. Burada da 1.resmin aksine beyaz ve beyaza çok yakın açık renkler 255 olarak atanırken kalan bütün değerler 0 olarak belirlendi. Bu da resmin çok koyu olmasını sağladı. Buradaki değerler, her resim ve her durum için özel olarak belirlenmelidir.

Görüntü işlemede kullanılan bir diğer yöntem ise bulanılıklaştırmadır (blur). Birden fazla fonksiyon ile bu işlem gerçekleştirilebilir.

output2 = cv2.blur(gray_image, (10, 10))
plt.imshow(output2)
plt.show()
Şekil 4. blur Fonksiyonu ile Bulanıklaştırılmış Resim
output2 = cv2.GaussianBlur(gray_image, (9, 9), 5)
plt.imshow(output2)
plt.show()
Şekil 5. GaussianBlur ile Bulanıklaştırılmış Resim

Şekil 4 ve Şekil 5 de görüldüğü üzere belirlenen bulanıklaştırma filtreleri ve bulanıklık dereceleri ile siyah-beyaz resim bulanıklaştırılmıştır. Genellikle bu işlem resimlerdeki gürültüleri temizlemek için kullanılır. Ancak bazı durumlarda resimlerdeki keskin hatların eğitim üzerindeki etkisi olumsuz olabilmektedir. Bu sebeple kullanıldığı durumlarda mevcuttur.

Elimizdeki verileri bazı durumlarda döndürerek kullanmak isteyebiliriz. Ya da veri olarak kullanılacak resimler eğik olabilir. Bu gibi durumlarda aşağıdaki fonksiyonlar kullanılabilir.

(h, w) = img.shape[:2]
center = (w / 2, h / 2)
M = cv2.getRotationMatrix2D(center, 13, scale =1.1)
rotated = cv2.warpAffine(gray_image, M, (w, h))
plt.imshow(rotated)
plt.show()
Şekil 6. getRotationMatrix2D Fonksiyonu ile Döndürülmüş Resim

Öncelikle resmin merkezi belirlenirek döndürme işlemi bu merkeze göre gerçekleştirilir. Yukarıda kullanılan getRotationMatrix2D fonksiyonunun ilk parametresi hesapladığımız merkez değerleri, ikinci parametre açı değeri (Şekil 6 için 13) ve son olarak üçüncü parametre ise döndürme işlemi sonucunda ölçekleme değeri. Bu değer 1 olarak bırakılırsa herhangi bir ölçekleme yapmadan aynı resmi sadece verilen açıya göre döndürür. Buradaki değer büyüdükçe resimde merkeze göre büyütme işleme (zoom in) gerçekleşir.

Örnek 1

Yukarıda bahsi geçen yöntemler genellikle projelerde birlikte kullanılırlar. Bu yapıların ve sürecin daha iyi anlaşılması için örnek bir uygulama yapalım. Araçlar için otonom sürüş pilotu eğitmek istediğimizi düşünelim [4]. Bu problem için Şekil 1' deki resim incelindiğinde öncelikle yapay zeka pilotumuzun yolu ve şeritleri anlayabilmesi gerekir. Bunun için OpenCV kütüphanesinden destek alalım. Öncelikle resim sisteme yüklenir. Bu problemde rengin bir önemi olmadığından dolayı resim siyah-beyaz formata getirilir. Resime threshold değeri atanarak veriyi temsil eden matris değerleri 0 ve 255 değerlerine çevrilir. Yukarıda threshold fonksiyonunun anlatımında da bahsedildiği üzere threshold değerinin seçimi bu fonksiyon için kritik öneme sahiptir. Bu problem için threshold değerinin 200 olarak alınması bizim işimize daha çok yarayacaktır. Yol sınırlarına ve şeritlere odaklanmak yeterli olacağından diğer ayrıntıları temizleyebiliriz. Gürültülerden kurtulmak için de GaussianBlur fonksiyonu ile bulanıklaştırma işlemi yapılır. Buraya kadar olan kısımlar ayrıntılı olarak Şekil 1–5 arası incelenebilir.

Bu işlemlerden sonra Canny kenar tanıma (edge detection) işlemi uygulanır.

img = cv2.imread(img_path)
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, output2) = cv2.threshold(gray_image, 200, 255, cv2.THRESH_BINARY)
output2 = cv2.GaussianBlur(output2, (5, 5), 3)
output2 = cv2.Canny(output2, 180, 255)
plt.imshow(output2)
plt.show()
Şekil 7. Canny Fonksiyonu sonucu Resim

Canny fonksiyonunun aldığı ilk parametre işlemin uygulanacağı resim, ikinci parametre düşük eşik değeri (low threshold value), üçüncü parametre ise yüksek eşik değeridir (high threshold value). Kenar algılama işleminde ilk olarak resim piksel piksel taranır. Düşük eşik değerinden daha düşük bir değer bulunduğu anda kenarın ilk tarafı tespit edilmiş olur. Bu sınırda tarama işlemi devam eder. Yüksek eşik değerinden daha yüksek bir değer bulunduğunda ise diğer taraf da tespit edilerek kenar oluşturulur. Bu sebeple buradaki eşik parametre değerleri her resime ve her probleme özel olarak belirlenir. Buradaki GaussianBlur etkisini daha iyi gözlemleyebilmek adına aynı işlemleri bu defa herhangi bir bulanıklaştırma olmadan yapalım.

img = cv2.imread(img_path)
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, output2) = cv2.threshold(gray_image, 200, 255, cv2.THRESH_BINARY)
output2 = cv2.Canny(output2, 180, 255)
plt.imshow(output2)
plt.show()
Şekil 8. Bulanıklaştırma Yapılmamış Resim

Herhangi bulanıklaştırma işlemi yapılmadığı durumda Şekil 8'deki kirlilik açıkça görülebilir. Bulanıklaştırma yapılmaması sonucu oluşan gürültüler, belki bu projemiz için çok problem oluşturmayabilir ancak farklı proje ve durumlarda eğitim başarısına büyük etkileri olacaktır. Bu aşamadan sonra belirlenen kenarlar esas alınarak gerçek resim üzerine işlemler yapılır. Bunun için HoughLinesP ve line fonksiyonları kullanılmıştır.

lines = cv2.HoughLinesP(output2, 1, np.pi/180,30)
for line in lines:
x1,y1,x2,y2 = line[0]
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),4)
plt.imshow(img)
Şekil 9. HoughLinesP Sonucu Resim

Şekil 9'daki resimde görüldüğü üzere yol sınırları ve şeritler güzel bir şekilde elde edildi. Ancak resim dikkatli bir şekilde incelendiğinde, bazı problemler fark edilecektir. Şerit ve yol sınırlarını tespit etmesinde problem olmamasına rağmen bulutlar da sanki yol sınırıymış gibi algılanmıştır. Bu problemlerin önüne geçebilmek için maskeleme yönteminin kullanılması gerekir[5].

def mask_of_image(image):
height = image.shape[0]
polygons = np.array([[(0,height),(2200,height),(250,100)]])
mask = np.zeros_like(image)
cv2.fillPoly(mask,polygons,255)
masked_image = cv2.bitwise_and(image,mask)
return masked_image

Yukarıdaki mask_of_image fonksiyonu ile maskeleme işlemini yapabiliriz. Öncelikle maskelemek istediğimiz alanı poligon olarak belirleriz. Buradaki parametre değerleri tamamen veriye özel değerlerdir.

Şekil 10. Maskeleme Uygulanacak Alan

Şekil 10' daki maske gerçek resim üzerine uygulanır. Gerçek resimde siyah alana karşılık gelen yerlere herhangi bir işlem uygulanmazken, beyaz alana karşılık gelen yerlere yukarıdaki işlemlerin tamamı uygulanır. Bu işlem de bitwise_and fonksiyonu ile gerçekleştirilir.

Şekil 11. Maskeleme Uygulanmış Resim

Sonuç olarak Şekil 11' de görüldüğü üzere maskeleme işlemi sonucunda bulutlarda gördüğümüz problemi de halletmiş olduk. Böylece uygulama tamamlanmış oldu. Artık verimiz eğitim veya farklı süreçler için hazır hale gelmiş oldu.

Örnek 2

HougLinesP ile şerit tanıma problemini çözdük. Bu problemin dairesel şekiller için geçerli olduğunu düşünelim[6].

Şekil 12. Madeni Paralar [8]

Şekil 12'deki madeni paraları tanıyan bir görüntü işleme süreci oluşturmak isteyelim. Bu durumda şerit tanımayla ilgili uyguladığımız adımlara benzer adımlar burada da uygulanacaktır.

img = cv2.imread("/Users/.../coin.png")
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, output2) = cv2.threshold(gray_image, 120, 255, cv2.THRESH_BINARY)
output2 = cv2.GaussianBlur(output2, (5, 5), 1)
output2 = cv2.Canny(output2, 180, 255)
plt.imshow(output2, cmap = plt.get_cmap("gray"))
circles = cv2.HoughCircles(output2,cv2.HOUGH_GRADIENT,1,10, param1=180,param2=27,minRadius=20,maxRadius=60)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)

plt.imshow(img)
Şekil 13. HoughCircles Fonksiyonu Sonucu Madeni Paralar

Yapılan görüntü işleme süreci sonucunda Şekil 13' deki yapıya ulaşılabilir. Resim siyah-beyaz hale getirilir. Sonrasında threshold fonksiyonu uygulanır. Bulanıklaştırma işlemi yapılır sonrasında Canny ile kenar tanıma işlemi tamamlanır. Son olarak HoughCircles ile sınırları belirlenen daireler çizilir.

Görüntü işleme, aynı zamanda görüntü formatındaki yazılara da uygulanmaktadır.

Şekil 14. Resim Formatında Yazı

Şekil 14'de görülen yazı ile sistemimizi eğitmek istediğimizi varsayalım. Bütün kelimelerin veya istenen bazı spesifik kelimelerin eğitim sonucunda modelimiz tarafından tespit edilmesini istiyoruz. Bunun için kelimelerin pozisyon bilgilerinin sisteme öğretmemiz gerekebilir. Bu gibi problemlerde de OpenCV kütüphanesi kullanılmaktadır. Öncelikle Şekil 14'deki veri yazıya çevirilir. Bunun için Tesseract isimli optik karakter tanıma motoru kullanılır[7].

data = pytesseract.image_to_data(img, output_type=Output.DICT, config = "--psm 6")
n_boxes = len(data['text'])
for i in range(n_boxes):
(x, y, w, h) = (data['left'][i], data['top'][i], data['width'][i], data['height'][i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
plt.imshow(img)
plt.show()
Şekil 15. Kelime Pozisyon Bilgilerinin İşlenmesi

Tesseract yardımıyla elde edilen bilgilerin OpenCV ile birleştirilmesi sonucu Şekil 15'de görülen durum elde edilir. Burada her bir kelime ve her kelime bloğu çevçeve içerisine alınmıştır. İhtiyaç olması durumunda Tesseract’tan gelen bilgiler manipüle edilerek sadece belirli kelimlerin çerçeve içerisine alınması da mümkün olabilir. Bunun dışında yazının gürültülerden temizlenmesi için bulanıklaştırma işlemi yapılabilir. Ancak diğer örneklerdeki bulanıklaştırmayı yazı için yaptığımızda bu yazının kalitesini ve haliyle okunabilirliğini kötü yönde etkileyecektir. Bu sebeple, bu örnek için farklı bir bulanıklaştırma fonksiyonu olan medianblur kullanılacaktır.

img = cv2.imread(img_path)
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
output2 = cv2.medianBlur(gray_image, ksize=5)
plt.imshow(output2)
plt.show()
Şekil 16. medianBlur Uygulanmış Resim

Şekil 14' deki resim incelendiğinde bazı kelimelerin altlarında kesikli çizgiler açıkça görülebilir. Bu durum karakter tanıma motorlarının, kelimeleri yanlış okumasına sebebiyet verebilir. Şekil 16'da medianBlur işlemi sonucunda bu kesikli çizgilerin gittiği görülebilir.

Not : Siyah-beyaz resimlerin imread ile okunması sonucu oluşan matrislerinin boyutlar kontrol edilmelidir. Çoğu zaman resim siyah-beyaz olsa dahi RGB boyutları mevcuttur. Bu da OpenCV içerisindeki bazı fonksiyonlarda boyut hatası almanıza sebebiyet verebilir.

Erode ve Dilate fonksiyonları da görüntü formatındaki yazıların gürültülerinden kurtulmak veya yazının kalitesini artırmak için kullanılabilir.

kernel = np.ones((3,3),np.uint8)
output2 = cv2.dilate(gray_image,kernel,iterations = 3)
plt.imshow(output2)
plt.show()
Şekil 17. Dilate Fonksiyonu Sonucunda Oluşan Durum

Şekil 14' de alttan üçüncü satıra bakıldığında nokta şeklinde bazı gürültülerin olduğu görülecektir. Şekil 17' de dilate fonksiyonunun kullanılması ile birlikte bu gürültülerin önemli ölçüde giderildiği görülebilir. Oluşturulan filtre ve iterations parametre değerleri değiştirilerek yazıda üzerinde yapılan inceltme oranı değiştirilebilir. Yazının okunabilirliğini korumak açısından bu değerleri doğru belirlemek gerekir. Erode fonksiyonu ise dilate fonksiyonunun tersine yazının kalınlaşmasını sağlar.

kernel = np.ones((3,3),np.uint8)
output2 = cv2.erode(gray_image,kernel,iterations = 3)
plt.imshow(output2)
plt.show()
Şekil 18. Erode Fonksiyonu Sonucunda Oluşan Durum

Erode fonksiyonu ile Şekil 18' de görüldüğü gibi yazı kalınlıkları artırılmış oldu. Daha çok ince font ile yazılmış yazıların kalitesi artırmak için kullanılan bir yöntemdir. Tabi burada dikkat edilmesi gerek bir diğer husus, bizim yazılarımızın siyah arka planımızın ise beyaz olmasıdır. Eğer arka plan siyah ve yazılar beyaz olsaydı bu fonksiyonların işlevleri yer değiştirirdi.

Bazı resimlerin kalitelerini artırmak için de OpenCV kütüphanesi kullanılmaktadır. Kontrastı kötü olan resimlerin histogram değerleri dar bir alana yayılmış durumdadır. Bu resmin kontrastını iyileştirebilmek için histogram değerlerini geniş bir bölgeye yaymak gerekir. Bu işlemler için OpenCV kütüphanesi içerisindeki equalizeHist fonksiyonu kullanılır. Şekil 19' daki resim için histogram düzenlemesi yapalım.

Şekil 19. Histogram Değerleri Düzenlenmemiş Resim
Şekil 20. Orjinal Resmin Histogram Dağılımı

Şekil 20' de Şekil 19'daki resmin histogram grafiği görülebilir. Resimdeki objelerin görünebilirliği düşük seviyededir.

equ = cv2.equalizeHist(gray_image)
plt.imshow(equ)
Şekil 21. Histogram Eşitlemesi Yapılmış Resim
Şekil 22. Histogram Eşitlemesi Yapılmış Resmin Histogram Dağılımı

Şekil 21'de equalizeHist fonksiyonu ile histogram eşitlemesi yapılmış resim görülebilir. Resimin kalitesi ve netliği artmış durumdadır. Ayrıca Şekil 22' de histogram düzenlemesi yapılmış olan resmin histogram grafiği de görülebilir. Şekil 20' de bir alanda toplanan değerler, histogram eşitlemesinden sonra daha geniş bir alana yayıldığı görülebilir. Her resim için bu histogram değerleri kontol edilebilir. Gerekli durumlarda histogram düzenlemeleri yapılarak resmin kalitesi artırılabilir.

Bu çalışmada görüntü işleme teknikleri üzerinde durulmuştur. Python üzerinden OpenCV kütüphanesindeki birçok fonksiyonu kullanarak örnek uygulamalar yapılmıştır.

Github: https://github.com/ademakdogan

Linkedin : https://www.linkedin.com/in/adem-akdo%C4%9Fan-948334177/

Referanslar

[1]P.Erbao, Z.Guotong, “Image Processing Technology Research of On-Line Thread Processing”, 2012 International Conference on Future Electrical Power and Energy System, April 2012.

[2]H.Singh, Practical Machine Learning and Image Processing, pp.63–88, January 2019.

[3]R.H.Moss, S.E.Watkins, T.Jones, D.Apel, “Image thresholding in the high resolution target movement monitor”, Proceedings of SPIE — The International Society for Optical Engineering, March 2009.

[4]Y.Xu, L.Zhang, “Research on Lane Detection Technology Based on OPENCV”, Conference: 2015 3rd International Conference on Mechanical Engineering and Intelligent Systems, January 2015.

[5]F.J.M.Lizan, F.Llorens, M.Pujol, R.R.Aldeguer, C.Villagrá, “Working with OpenCV and Intel Image Proccessing Libraries. Proccessing image data tools”, Informática Industrial e Inteligencia Artificial, July 2002.

[6]Q.R.Zhang, P.Peng, Y.M.Jin, “Cherry Picking Robot Vision Recognition System Based on OpenCV”, MATEC Web of Conferences, January 2016.

[7]R.Smith, “An Overview of the Tesseract OCR Engine”, Conference: Document Analysis and Recognition, 2007. ICDAR 2007. Ninth International Conference on, Volume: 2, October 2007.

[8]https://www.mathworks.com/help/examples/images/win64/GetAxesContainingImageExample_01.png

--

--