Czy ktoś może mi powiedzieć, jak wdrożyć przełączenie obrazu na górną i dolną część? więc mogłem je pokrywać. Na przykład mam obraz i powinienem je podzielić, aby obliczyć wiele pikseli na każdej części. Jestem nowy w OpenCV i nie rozumiem dokładnie geometrii obrazu.

4
AinurZhappass 26 czerwiec 2017, 15:23

3 odpowiedzi

Najlepsza odpowiedź

Możesz przyciąć górną i dolną część obrazu w środku poziomo.

Otwórz obraz.

import cv2
import numpy as np
image = cv2.imread('images/blobs1.png')
cv2.imshow("Original Image", image)
cv2.waitKey(0) 

Użyj image.shape, abyśmy przechwytywać zmienne wysokości i szerokości.

height, width = image.shape[:2]
print image.shape

Teraz możemy rozpocząć przycinanie.

# Let's get the starting pixel coordiantes (top left of cropped top)
start_row, start_col = int(0), int(0)
# Let's get the ending pixel coordinates (bottom right of cropped top)
end_row, end_col = int(height * .5), int(width)
cropped_top = image[start_row:end_row , start_col:end_col]
print start_row, end_row 
print start_col, end_col

cv2.imshow("Cropped Top", cropped_top) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

# Let's get the starting pixel coordiantes (top left of cropped bottom)
start_row, start_col = int(height * .5), int(0)
# Let's get the ending pixel coordinates (bottom right of cropped bottom)
end_row, end_col = int(height), int(width)
cropped_bot = image[start_row:end_row , start_col:end_col]
print start_row, end_row 
print start_col, end_col

cv2.imshow("Cropped Bot", cropped_bot) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

Wreszcie możemy użyć image.size, aby dać użyć liczby pikseli w każdej części.

cropped_top.size
cropped_bot.size

Możesz zrobić to samo z konturami, ale zaangażuje obrywacze.

7
avereux 26 czerwiec 2017, 15:10

Oto znacznie bardziej elastyczna metoda, dzięki której można wyciąć obraz na pół lub w 4 równych częściach lub 6 części, jak zawsze potrzebujesz części.

Ten kod zostanie przycinanie obrazu najpierw na 2 sztukę poziomo, a następnie dla każdego z tych 2 sztuk przyczynie kolejne 3 obrazy pozostawiające łącznie 6 przycięte obrazy Zmień wartość przycinania_w_size i crop_size, aby dostosować ustawienia upraw. Będziesz potrzebował folderu przycinania, na którym ten kod zapisze obrazy.

import cv2,time

img = cv2.imread('image.png')
img2 = img

height, width, channels = img.shape
# Number of pieces Horizontally 
CROP_W_SIZE  = 3 
# Number of pieces Vertically to each Horizontal  
CROP_H_SIZE = 2 

for ih in range(CROP_H_SIZE ):
    for iw in range(CROP_W_SIZE ):

        x = width/CROP_W_SIZE * iw 
        y = height/CROP_H_SIZE * ih
        h = (height / CROP_H_SIZE)
        w = (width / CROP_W_SIZE )
        print(x,y,h,w)
        img = img[y:y+h, x:x+w]



        NAME = str(time.time()) 
        cv2.imwrite("CROP/" + str(time.time()) +  ".png",img)
        img = img2
2
amitnair92 20 listopad 2018, 08:13

Aby uprościć odpowiedź @ Avereux:

W Pythonie możesz użyć łączenia, aby rozbić obraz do obrazów. Składnia jest to:

sub_image = full_image[y_start: y_end, x_start:x_end]

Zauważ, że dla obrazów pochodzenie jest górnym rogiem obrazu. Więc piksel na pierwszym rzędzie obrazu (to jest najwyższy rząd) miałby współrzędne X_COORDINAT = X, Y_Orntyn = 0

Aby uzyskać kształt obrazu, użyj image.shape. To zwraca (no_of_rows, no_of_cols)

Możesz użyć tych do rozpadu obrazu, który chcesz.

13
Shawn Mathew 26 czerwiec 2017, 16:50