Chcę używać OpenCV2.0 i Python2.6, aby wyświetlać obrazy o zmienionym rozmiarze. Użyłem i zaadaptowałem przykład ze strony http://opencv.willowgarage.com/documentation/python/cookbook.html, ale niestety ten kod jest przeznaczony dla OpenCV2.1 i wydaje się, że nie działa na 2.0. Tutaj mój kod:
import os, glob
import cv
ulpath = "exampleshq/"
for infile in glob.glob( os.path.join(ulpath, "*.jpg") ):
im = cv.LoadImage(infile)
thumbnail = cv.CreateMat(im.rows/10, im.cols/10, cv.CV_8UC3)
cv.Resize(im, thumbnail)
cv.NamedWindow(infile)
cv.ShowImage(infile, thumbnail)
cv.WaitKey(0)
cv.DestroyWindow(name)
Ponieważ nie mogę użyć
cv.LoadImageM
użyłem
cv.LoadImage
zamiast tego, co nie stanowiło problemu w innych aplikacjach. Niemniej jednak cv.iplimage nie ma atrybutów wierszy, kolumn ani rozmiaru. Czy ktoś może mi podpowiedzieć, jak rozwiązać ten problem? Dzięki.
Odpowiedzi:
Jeśli chcesz używać CV2, musisz użyć tej
resize
funkcji.Na przykład spowoduje to zmianę rozmiaru obu osi o połowę:
a to zmieni rozmiar obrazu tak, aby miał 100 kolumn (szerokość) i 50 wierszy (wysokość):
Inną opcją jest użycie
scipy
modułu poprzez:Jest oczywiście więcej opcji, które możesz przeczytać w dokumentacji tych funkcji ( cv2.resize , scipy.misc.imresize ).
Aktualizacja:
Zgodnie z dokumentacją SciPy :
Zwróć uwagę, że jeśli chcesz zmienić rozmiar o czynnik , możesz chcieć
skimage.transform.rescale
.źródło
Przykład podwojenia rozmiaru obrazu
Istnieją dwa sposoby zmiany rozmiaru obrazu. Nowy rozmiar można określić:
Ręcznie;
height, width = src.shape[:2]
dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)
Przez współczynnik skalowania.
dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)
, gdzie fx jest współczynnikiem skalowania wzdłuż osi poziomej, a fy na osi pionowej.Aby zmniejszyć obraz, generalnie będzie wyglądał najlepiej z interpolacją INTER_AREA, podczas gdy aby powiększyć obraz, będzie wyglądał najlepiej z INTER_CUBIC (wolno) lub INTER_LINEAR (szybciej, ale nadal wygląda OK).
Przykład zmniejszania obrazu, aby zmieścił się na maksymalnej wysokości / szerokości (zachowując proporcje)
Używanie kodu z cv2
źródło
src = cv2.imread('YOUR_PATH_TO_IMG')
i zmieniłeś „YOUR_PATH_TO_IMG” na ścieżkę własnego obrazu?cv2.resize
automatycznie używa dopełnienie? jaki jest rozmiar okna utworzonego przy użyciu żądanego rozmiaru wyjściowego(width/10, height/10)
?Możesz użyć funkcji GetSize, aby uzyskać te informacje, cv.GetSize (im) zwróci krotkę z szerokością i wysokością obrazu. Możesz także użyć im.depth i img.nChan, aby uzyskać więcej informacji.
Aby zmienić rozmiar obrazu, użyłbym nieco innego procesu, z innym obrazem zamiast matrycy. Lepiej jest spróbować pracować z tym samym typem danych:
Mam nadzieję że to pomoże ;)
Julien
źródło
źródło
cv2.resize
automatycznie używa dopełnienie? jaki jest rozmiar okna utworzonego za pomocą(w, target_height)
argumentów?Oto funkcja zwiększania lub zmniejszania obrazu o żądaną szerokość lub wysokość przy zachowaniu współczynnika proporcji
Stosowanie
Na podstawie tego przykładowego obrazu
Po prostu przeskaluj w dół do
width=100
(w lewo) lub w górę dowidth=300
(w prawo)źródło