[Çözüldü] Python Opencv Siyah Bölgeleri Silerken Renk Sorunu

Selamlar,
aşağıdaki resmin etrafındaki siyah alanları yine aşağıdaki kod ile kırpıyorum. Fakat 2.resimde görüldüğü gibi renkler istediğim gibi çıkmıyor. Yardımcı olabilir misiniz ? Renklerin ilk resimdeki gibi çıkmasını istiyorum.

import cv2
import numpy as np
def trim(frame):
    #crop top
    if not np.sum(frame[0]):
        return trim(frame[1:])
    #crop bottom
    elif not np.sum(frame[-1]):
        return trim(frame[:-2])
    #crop left
    elif not np.sum(frame[:,0]):
        return trim(frame[:,1:])
    #crop right
    elif not np.sum(frame[:,-1]):
        return trim(frame[:,:-2])
    return frame

img = cv2.imread("resim.png")
thold = (img>120)*img
trimmedImage = trim(thold)
cv2.imwrite('img.jpg', trimmedImage)
cv2.waitKey()

yanlış renkli hali:

Aşağıdaki fonksiyonu kullanarak sorunu çözdüm.

def autocrop(image, threshold=0):
    """Crops any edges below or equal to threshold

    Crops blank image to 1x1.

    Returns cropped image.

    """
    if len(image.shape) == 3:
        flatImage = np.max(image, 2)
    else:
        flatImage = image
    assert len(flatImage.shape) == 2

    rows = np.where(np.max(flatImage, 0) > threshold)[0]
    if rows.size:
        cols = np.where(np.max(flatImage, 1) > threshold)[0]
        image = image[cols[0]: cols[-1] + 1, rows[0]: rows[-1] + 1]
    else:
        image = image[:1, :1]

    return image

#yukarıdaki fonksyion numpy array tipinde bir değer döndürüyor bu değeri
#opencv imwrite ile img.png adında bir dosyaya yazdırıyoruz. Bu arada yukarıdaki
#fonksiyona yine array tipinde bir değer vermemiz gerektiği için image parametresine
#değer verirken imread fonksiyonunu kullanmamız gerekiyor. Threshold değerini kendinize
#göre yükseltmeniz gerekiyor çok düşük olursa kırpma yapmıyor.
cv2.imwrite("img.png", autocrop(cv2.imread("resim.png"), threshold=1000))

Başlığa çözüldü yazmak yerine kendi cevabınızdaki kutucuğu işaretleyebilirsiniz.

1 Beğeni