Python'da bir resimdeki belirli bir alanı seçmek

Katılım
27 Nisan 2022
Mesajlar
2.064
Çözümler
17
Mesela ekran görüntüsü alırken bir seçim ekranı geliyorya böyle bir kare oluşturuyoruz. Bende bunu istiyorum. Tkinter penceresinde resmi açacak, sonra da resimi kırpmak için alan seçecek. O alan seçen kısmı nasıl olacağını çözemedim. Sadece orayı gösterebilecek arkadaşlar varsa yardımcı olabilirler mi? Yani ben bir resimdeki kareyi nasıl seçeceğim?
 
Mesela ekran görüntüsü alırken bir seçim ekranı geliyorya böyle bir kare oluşturuyoruz. Bende bunu istiyorum. Tkinter penceresinde resmi açacak, sonra da resimi kırpmak için alan seçecek. O alan seçen kısmı nasıl olacağını çözemedim. Sadece orayı gösterebilecek arkadaşlar varsa yardımcı olabilirler mi? Yani ben bir resimdeki kareyi nasıl seçeceğim?

Tıkladığınız yerin konumunu alacak bir kod yazılabilir gibi. Aldığınız konum ile piksel olarak arka plandan kesersiniz ama dümdüz çizgi gibi kesilmesi için aklıma bir şey gelmedi.
 
Mesela ekran görüntüsü alırken bir seçim ekranı geliyorya böyle bir kare oluşturuyoruz. Bende bunu istiyorum. Tkinter penceresinde resmi açacak, sonra da resimi kırpmak için alan seçecek. O alan seçen kısmı nasıl olacağını çözemedim. Sadece orayı gösterebilecek arkadaşlar varsa yardımcı olabilirler mi? Yani ben bir resimdeki kareyi nasıl seçeceğim?

OpenCV kullanabilirsin.

Python:
import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
 
Konumu kendisi bulup o radaki X, Y, H, W değişkenlerine verecek. Bunu düşünemeyen yazılıma başlamasın zaten dostum.

İstenilen program belirttiğinizden kat kat "Kullanıcı dostu". Fakat sizin verdiğiniz taktik amelelik olmasına rağmen, "düşünemeyen yazılıma başlamasın" diyorsunuz. Karşındaki kişi bunu düşünüp, bir adım ilerisini, yani daha kullanışlı hâlini nasıl yaparım diye düşünüyor dostum.
 
İstenilen program belirttiğinizden kat kat "Kullanıcı dostu". Fakat sizin verdiğiniz taktik amelelik olmasına rağmen, "düşünemeyen yazılıma başlamasın" diyorsunuz. Karşındaki kişi bunu düşünüp, bir adım ilerisini, yani daha kullanışlı hâlini nasıl yaparım diye düşünüyor dostum.
İlla tüm kodu yazdıracaksınız. Neden elle yazmak gereksin arkadaşlar bahsetmiş o kadar resimde tıklanan noktanın kordinatının alınabileceğinden. Yapılması gereken tek şey tıklanan noktanın kordinatını alıp benim verdiğim örnek koddaki x,y yerlerine yazmaktı. Eğer okuduğunuzu bile anlayamıyorsanız, yada anlıyor ve bunu yapacağınızı düşünemiyorsanız yazılıma hiç başlamamanızı öneririm.


imread kısmına uygun resim path'i verdiğinizde çalışan kod üşenmedim yazdım:
Python:
import cv2
counter,cord = 0,[]
def click_event(event, x, y, flags, params):
    global counter
    if event == cv2.EVENT_LBUTTONDOWN:
        counter=counter+1
        if counter<=2:
            cv2.line(img, (x, 0), (x, img.shape[0]), (255, 0, 0), 5)
            cv2.line(img, (0, y), (img.shape[1],y), (255, 0, 0), 5)
            cord.append([x,y])
            cv2.imshow('image', img)
        if counter == 2:
            print(cord)
            im = img[cord[0][1]:cord[1][1],cord[0][0]:cord[1][0]]
            cv2.imshow('image', im)
if __name__ == "__main__":
    img = cv2.imread('img.png', 1)
    cv2.imshow('image', img)
    cv2.setMouseCallback('image', click_event)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 
İlla tüm kodu yazdıracaksınız. Neden elle yazmak gereksin arkadaşlar bahsetmiş o kadar resimde tıklanan noktanın kordinatının alınabileceğinden. Yapılması gereken tek şey tıklanan noktanın kordinatını alıp benim verdiğim örnek koddaki x,y yerlerine yazmaktı. Eğer okuduğunuzu bile anlayamıyorsanız, yada anlıyor ve bunu yapacağınızı düşünemiyorsanız yazılıma hiç başlamamanızı öneririm.


imread kısmına uygun resim path'i verdiğinizde çalışan kod üşenmedim yazdım:
Python:
import cv2
counter,cord = 0,[]
def click_event(event, x, y, flags, params):
    global counter
    if event == cv2.EVENT_LBUTTONDOWN:
        counter=counter+1
        if counter<=2:
            cv2.line(img, (x, 0), (x, img.shape[0]), (255, 0, 0), 5)
            cv2.line(img, (0, y), (img.shape[1],y), (255, 0, 0), 5)
            cord.append([x,y])
            cv2.imshow('image', img)
        if counter == 2:
            print(cord)
            im = img[cord[0][1]:cord[1][1],cord[0][0]:cord[1][0]]
            cv2.imshow('image', im)
if __name__ == "__main__":
    img = cv2.imread('img.png', 1)
    cv2.imshow('image', img)
    cv2.setMouseCallback('image', click_event)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
Hocam tkinterla demiş ama elinize sağlık. Aynı mantıkla bi label oluşturup resmi labelda görüntüleyip benzer şekilde tkinterla yapılabilir.
 

Technopat Haberler

Geri
Yukarı