티스토리 뷰

OpenCV

OpenCV 기초 - Image Processing(Resize, Flipping)

OpenCV의 대가를 꿈꾸며. 2018. 4. 2. 11:50

OpenCV 에서  Basic image processing 는 다음과 같이 9가지를 이야기 하고 있습니다.

  • 1: Translation (상하, 좌우 이동)
  • 2: Rotation (그림의 회전 ,중심축이 어디냐?)
  • 3: Resizing (이미지의 사이즈 조정, Aspect Ratio고려)
  • 4: Flipping (수평, 수직으로 뒤집기)
  • 5: Cropping (그림 일부만 가져오기)
  • 6: Image arithmetic (그림을 더 진하게, 연하게 만들기)
  • 7: Bitwise operations (그림의 Bit 연산)
  • 8: Masking (마스크)
  • 9: Splitting and merging channels ( Color Channel 로 나누고, 합치고)

오늘은 Resizing, Flipping에 대해서 알아보겠습니다.

Resizing

Resizing 에서 주의할 것은 그림을 줄이거나 늘릴때, 그림의 비율 Aspect Ratio 를 항상 유지해야 한다는 것입니다.

만약 width, height 중에서 긴쪽을 960으로 한다고 한다면, 아래와 같이 해서 Width, Height 을 조정할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
(h, w) = image.shape[:2]
 
if w > h:
    x = 960
    y = int((longer*h)/w)
    dim = (x, y)
else:
    y = 960
    x = int((longer * w)/h)
    dim = (x, y)
cs


두번째는 그림을 줄이거나 늘릴 때, 사용하는 보간법(interpolation) method가 다섯가지 있습니다.

이 보간법을 좀 이해해야 하는데, 기본 이론은 여기서 설명하지 않겠습니다.

  • cv2.INTER_NEAREST : 속도가 빠른데, 그림의 품질은 좋지 않음
  • cv2.INTER_LINEAR    : 사진을 키울 때 사용. 
  • cv2.INTER_AREA       : 사진을 줄일 때 사용.
  • cv2.INTER_CUBIC
  • cv2.INTER_LANCZOS4)
이것을 종합해 보면 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
# load the image and show it
image = cv2.imread('images/beach.png')
 
# width 을 600 으로 할때
ratio = 600.0 / image.shape[1]
dim = (600int(image.shape[0* ratio))
 
# perform the actual resizing of the image
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Width)", resized)
cs


Flipping

이미지 뒤집기(Flipping)은 매우 간단합니다. X축으로 뒤집기를 할 것인지, Y축으로 할지, 동시에 X, Y축으로 할지만 결정하면 됩니다.


flipCode로 나누는데, 

  • 0 :    X축으로 뒤집기
  • 1 (Positive) : Y 축으로 뒤집기 : 양수이면 모두 가능
  • -1 (Negative) : 동시에 뒤집기 : 음수이면 모두 가능

소스 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
image = cv2.imread("images/beach600.jpg")
cv2.imshow("Original", image)
 
# X축 뒤집기
flipped = cv2.flip(image, 0)
cv2.imshow("X axis", flipped)
 
# Y축 뒤집기
flipped = cv2.flip(image, 1)
cv2.imshow("Y axis", flipped)
 
# X, Y축 동시
flipped = cv2.flip(image, -1)
cv2.imshow("Both Flipped", flipped)
 
 
cv2.waitKey(0)
cv2.destroyAllWindows()
cs

그리고 그 결과물은




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함