2017-06-20 8 views
2

Ich benutze Python 3 und die neueste Version von openCV. Ich versuche, ein Bild mit der Funktion zur Größenanpassung zu skalieren, aber nach der Größenänderung ist das Bild sehr verzerrt. Code:Größe eines Bildes ohne Verzerrung ändern OpenCV

import cv2 
file = "/home/tanmay/Desktop/test_image.png" 
img = cv2.imread(file , 0) 
print(img.shape) 
cv2.imshow('img' , img) 
k = cv2.waitKey(0) 
if k == 27: 
    cv2.destroyWindow('img') 
resize_img = cv2.resize(img , (28 , 28)) 
cv2.imshow('img' , resize_img) 
x = cv2.waitKey(0) 
if x == 27: 
    cv2.destroyWindow('img') 

Das Originalbild wird 480 x 640 (RGB daher habe ich die 0 es in Graustufen zu erhalten)

Gibt es eine Möglichkeit, die Größe verändern könnte und vermeiden, dass die Verzerrung OpenCV oder andere Verwendung Bibliothek vielleicht? Ich beabsichtige, einen handschriftlichen Ziffernerkenner zu machen, und ich habe mein neurales Netz unter Verwendung der MNIST Daten trainiert, deshalb brauche ich das Bild, um 28x28 zu sein.

+3

ohne jede Verzerrung helfen haben Sie 2 Möglichkeiten: a) Ernte Teil des Bildes es das gleiche Seitenverhältnis zu machen. b) Hinzufügen eines Teils des Bildes (z. B. schwarze Pixel) zu den Seiten der Bilder, um dasselbe Seitenverhältnis zu erhalten. Wenn Sie nicht das gleiche Seitenverhältnis haben, ist es nicht möglich, es ohne Verzerrung zu erhalten. – api55

+0

Sie müssen sicherstellen, dass das Seitenverhältnis der neuen Größe dem Originalbild entspricht, und stellen Sie sicher, dass Sie eine geeignete Interpolationsmethode verwenden. –

+0

Ich habe dem Originalbild schwarze Pixel hinzugefügt, um es 640x640 zu machen, aber immer noch wenn ich die Größe ändere Ich bekomme ein verzerrtes Bild. Was kann ich tun ? –

Antwort

9

Sie können unten versuchen. Die Funktion behält die Bildrate des Originalbildes bei.

def image_resize(image, width = None, height = None, inter = cv2.INTER_AREA): 
    # initialize the dimensions of the image to be resized and 
    # grab the image size 
    dim = None 
    (h, w) = image.shape[:2] 

    # if both the width and height are None, then return the 
    # original image 
    if width is None and height is None: 
     return image 

    # check to see if the width is None 
    if width is None: 
     # calculate the ratio of the height and construct the 
     # dimensions 
     r = height/float(h) 
     dim = (int(w * r), height) 

    # otherwise, the height is None 
    else: 
     # calculate the ratio of the width and construct the 
     # dimensions 
     r = width/float(w) 
     dim = (width, int(h * r)) 

    # resize the image 
    resized = cv2.resize(image, dim, interpolation = inter) 

    # return the resized image 
    return resized 

Hier ist ein Beispiel Verwendung.

image = image_resize(image, height = 800) 

Hoffnung, das hilft.

+0

Was ist, wenn ich das Seitenverhältnis des Originalbildes ändern möchte? Ich möchte jedes Bild unabhängig von seiner ursprünglichen Größe auf 28x28 bringen. –

+1

Dann gehen Sie direkt zu 'cv2.resize (image, (28,28), interpolation = inter)'. – thewaywewere

+1

@TanmayBhatnagar können Sie mir auch eine Stimme geben, wenn meine Antwort hilft, Ihr Problem zu lösen? – thewaywewere

0

Probieren Sie diese einfache Funktion in Python, die opencv verwendet. Pass einfach das Bild auf und erwähne die Größe des gewünschten Quadrats.

def get_square(image,square_size): 

    height,width=image.shape 
    if(height>width): 
     differ=height 
    else: 
     differ=width 
    differ+=4 

    mask = np.zeros((differ,differ), dtype="uint8") 
    x_pos=int((differ-width)/2) 
    y_pos=int((differ-height)/2) 
    mask[y_pos:y_pos+height,x_pos:x_pos+width]=image[0:height,0:width] 
    mask=cv2.resize(jk,(square_size,square_size),interpolation=cv2.INTER_AREA) 

    return mask 

Nutzung: squared_image = get_square (Bild, 28)

Erläuterung: Funktionseingang jeder Größe annimmt und sie schafft einen quadrierten Form leere Bild der Größe größer als die Höhe des Eingangsbildes und Breite. platziert es das Originalbild in der Mitte des leeren Bildes. und dann ändert es dieses quadratische Bild in die gewünschte Größe, so dass die Form des ursprünglichen Bildinhalts erhalten bleibt.

Hoffnung, das Sie

Verwandte Themen