Bu uygulama ile programda işlenilen görüntüdeki en büyük nesneyi tanıyıp kullanıcıya göstermesini amaçladım. Bu uygulamanın daha verimli çalışması için programa verilen görüntüdeki arkaplan ve nesnelerin renklerinin birbirine çok yakın olmaması gerekiyor. İlk deneme yaptığım fotoğrafı kendim çektiğim için arkaplan ışıklandırması çok iyi olmadı. O yüzden daha gri bir arkaplan oluştu. Arkaplan renginin yapılacak işlemi bozmaması için program içinden “threshold” değeri ayarlanmalıdır.

İşlemin daha verimli çalışması için fotoğraf önce terslenerek arkaplanın siyaha en yakın değere getiriyoruz. Daha sonra “grayscale” işlemi uygulayarak renklerden arındırıyoruz. Son işlem olarak da siyahların tamami ile siyah olması ve nesnelerin tamami ile beyaz gözükmesi için bir “threshold” işlemi uyguluyoruz. Fotoğrafın hesaplama yapılan hali sağ alttaki halidir.
Fotoğraf diğer işlemlerin yapılması için hazır hale getirildikten sonra “contour” bulma işlemi uygulanıyor. Bu işlem ile nesneler arkaplana zıt renkte olduğu için tanınmış oluyor. Daha sonra her bulunun “contour” tek tek çizdirilip alanları hesaplanıyor ve üstlerine yazdırılıyor. Hesaplanan alanlar karşılaştırmaya tabi edilip en büyük alan ortaya çıkarılıyor. En büyük alana sahip olan nesne yeniden farklı bir renk ile belirtiliyor.


Eğer fotoğrafta beyaza çok yakın nesneler var ise üstteki resimdeki sağdaki tornavida gibi bozulmalar olabiliyor.
Programın kodu da aşağıdaki gibi:
import cv2
import numpy as np
#Çalışma bölgesini hazırlama
frame = cv2.imread("foto.jpg")
frame_small = cv2.resize(frame, (600, 400))
frame_reversed = cv2.bitwise_not(frame_small)
frame_gray = cv2.cvtColor(frame_reversed, cv2.COLOR_BGR2GRAY)
_, threshold = cv2.threshold(frame_gray, 120, 255, cv2.THRESH_BINARY)
#Parçaları belirleme
_, contours, hierarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
area_list = []
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
area = cv2.contourArea(cnt)
area_list.append(area)
maks_index = np.argmax(area_list)
if area>30:
cv2.putText(frame_small,str(area), (x,y-5), 2, 0.8, (0, 255, 0), 1)
cv2.rectangle(frame_small, (x, y), (x + w, y + h), (0, 255, 0), 2)
#Büyük parçayı yazdırma
print("maks: ", max(area_list))
(x_max, y_max, w_max, h_max) = cv2.boundingRect(contours[maks_index])
cv2.rectangle(frame_small, (x_max, y_max) , (x_max + w_max, y_max + h_max), (0, 0, 255), 2)
cv2.putText(frame_small, str(max(area_list)) , (x_max,y_max-5), 2, 0.8,(0, 0, 255), 1 )
#Sonuç Gösterme
cv2.imshow("Original", frame_small)
cv2.imshow("Gray", frame_gray)
cv2.imshow("Reversed", frame_reversed)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()