본문 바로가기

카테고리 없음

[Computer Vision기초] openCV를 사용하여 Image cropping과 masking하기

1. openCV를 이용하여 이미지 간단히 불러오기(함수화)

import cv2  ## opencv
import matplotlib.pyplot as plt ## matplotlib
## 이미지 읽어오는 것 함수화
def read_image(im_name):
    image = cv2.imread(im_name)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    plt.imshow(image_rgb)
    plt.show()
    return image_rgb

 

## 이미지 두 개 불러오기
im1=read_image('image.jpeg')
im2=read_image('image2.jpeg')

## 이미지 사이즈 출력
print(im1.shape, im2.shape)

 

2. openCV를 이용하여 image cropping(이미지 자르기)하기

Image cropping의 여러 방법 중 인덱스를 사용하여 이미지를 자르는 과정을 진행하려고 한다.

 

2-1) 함수화로 간단하게 이미지 불러오기

import cv2  ## opencv
import matplotlib.pyplot as plt ## matplotlib
## 이미지 읽어오는 것 함수화
def read_image(im_name):
    image = cv2.imread(im_name)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    plt.imshow(image_rgb)
    plt.show()
    return image_rgb

 

## 이미지 두 개 불러오기
im1=read_image('image.jpeg')
im2=read_image('image2.jpeg')

## 이미지 사이즈 출력
print(im1.shape, im2.shape)

 

2-2) 인덱스를 활용하여 image cropping하기

# 원본 이미지의 사이즈 받아두기
h1, w1 = im1.shape[:2]
h2, w2 = im2.shape[:2]
# 타겟 사이즈 지정
size = 720
def center_crop(im,h,w,size):
    im = im[int(h/2-size/2):int(h/2+size/2), int(w/2-size/2):int(w/2+size/2)]    # index 값은 반드시 int
    return im

im1 = center_crop(im1,h1,w1,size)
im2 = center_crop(im2,h2,w2,size)

 

## 함수화 : 이미지 두개 함께 보여주기
def two_image_show(im1,im2):
    plt.figure(figsize=(15,8))

    plt.subplot(1,2,1)
    plt.imshow(im1)
    plt.subplot(1,2,2)
    plt.imshow(im2)
    plt.show()

two_image_show(im1,im2)

 

3. 비트연산을 사용하여 Image masking(이미지 자르기)하기

using bit-wise operations

비트연산에 관련된 부가적인 설명은 하단의 링크 참조

import numpy as np

3-1) 인덱스를 활용한 mask

# np.zeros_like(im1) : lm1 사이즈만큼 0으로 채우기(검정)
im1_mask = np.zeros_like(im1)
im1_mask[int(size/2):,] = im1[int(size/2):,]    # 반틈은 기존 이미지 넣기
im2_mask = np.zeros_like(im2)
im2_mask[:int(size/2), ] = im2[:int(size/2), ]

two_image_show(im1_mask, im2_mask)

 

두 mask_image를 병합하게 되면, 아래와 같다.

merge = cv2.bitwise_or(im1_mask, im2_mask)
plt.imshow(merge)
plt.show()

 

3-2) circle mask

circle mask를 하기 위해서는 앞서 진행한것처럼 mask이미지를 제작하여 기존이미지와 합치는 방식으로 진행할 예정이다.

우선 아래와 같이 openCV에 포함된 cv2.circle라는 함수를 활용하여 mask이미지 위에 흰 원을 그리고

## circle mask
circle_mask = np.zeros_like(im2)
cv2.circle(circle_mask, (size//2,size//2), size//3, (255,255,255), -1 )
#cv2.circle(대상이미지, (원점x, 원점y), 반지름, (색상), 채우기)

 

masked_im2 = cv2.bitwise_and(im2, circle_mask)

plt.imshow(masked_im2)

 

4. 이미지 저장하기

plt.imsave('save_img.png', masked_im2)

 

 

 

 

 

[비트연산 세부 설명]

https://copycoding.tistory.com/156