반응형

촬영된 영상이나 사진찍힌 이미지의 특정부분을 도려내고 편집할 경우 필요하다

또는 특정영역만 뽑아내서 이미지프로세싱할 경우 필요하다.

 

그전에 알아두어야 할 사항은 파이썬의 OpenCV에서 출력하는 영상의 구조는 아래와 같다.

수학에서 사용하는 왼쪽하단의 원점이 아닌, 왼쪽 상단부터 우측하단까지 좌표를 0~max로 둔다.

원본 사진

아래 코드는 원본에서 자를 시작위치(새로운 원점)을 정하고, 그 기준으로 자를 프레임 크기를 정함.

'''
    made by 안산드레아스
    이미지 특정영역 잘라내기
    필요 패키지 : python-opencv
'''
import cv2


'''
    이미지를 자르는 함수
    :param
        img  : 이미지
        x, y : 자를곳 시작 좌표
        w, h : 자를 폭과 길이
'''
def im_trim(img, x, y, w, h):
    imgtrim = img[y: y + h, x: x + w]
    return imgtrim


# 현재경로의 이미지 불러오기
sample = cv2.imread('./0.jpg')
cv2.imshow('org', sample)

# 함수 실행하기
# 원본영상의 자를 영역 원점 x,y좌표 지정. 그리고 새로 생성할 이미지 frame크기 지정
result = im_trim(sample, 200, 200, 300, 300)
cv2.imshow('img', result)

cv2.waitKey(0)
cv2.destroyAllWindows()
반응형

결과는 아래와 같다. 이해하기 쉽게 하기 위해 원본영상과 편집된 영상을 동시에 출력시켰다.

해당 코드를 수정해서 원하는 특정부분을 잘라내고 크기를 정해 사용할 수 있다.

 

반응형
반응형

 

이미지가 좀 어두워서 영상처리에 문제가 있거나 할때 프로그래밍으로 인의적인 밝기향상을 시킬 수 있다.

즉 Brightness(밝기)를 픽셀하나하나에 갚을 더 넣어 강조 시켜줄 수 있다.

'''
    made by 안산드레아스
    출력하는 영상 또는 이미지의 전체적인 밝기(brightness)를 조절
    필요 패키지 : python-opencv
'''
import cv2

'''
    이미지 밝기 향상.
    원본, 0~255 값 한도 (픽셀값 강조)
'''
def increase_brightness(img, value):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)

    lim = 255 - value
    v[v > lim] = 255
    v[v <= lim] += value

    final_hsv = cv2.merge((h, s, v))
    img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)

    return img


# 현재경로의 이미지 불러오기
sample = cv2.imread('./0.jpg')

# 함수 실행하기
# 0~1280 사이 값으로 Downscale 하고자 하는 비율값을 입력
result = increase_brightness(sample, 0)
cv2.imshow('img', result)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

반응형

 

0 값을 넣으면 현재 이미지는 원본상태가 뜬다.

255 최댓값을 넣을 때

100넣을 때

 

적당한 값을 넣어서 내가 사용하는 이미지 또는 영상의 밝기를 인위적으로 통제할 수 있다.

 

 

 

 

 

반응형
반응형

어떤 이미지 또는 영상의 원본 해상도 크기가 너무 클 때 아래 함수로 Downscale을 할 수 있다.

'''
    made by 안산드레아스
    출력하는 영상 또는 이미지의 크기가 너무 클때 Downscale 시키는 함수
    필요 패키지 : python-opencv
'''
import cv2

'''
   x값에 0~1280 내 값을 넣으면 화면비율을 축소시키는 함수 정의
'''
def downscale(img, x):
    if x > 1280:
        print("Down Scale not available because you exceed maximum size")
        return

    y = int(0.75 * x)
    print(x)
    print(y)
    img = cv2.resize(img, (x, y))
    cv2.imshow('b', img)
    return img


# 현재경로의 이미지 불러오기
sample = cv2.imread('./0.jpg')

# 함수 실행하기
# 0~1280 사이 값으로 Downscale 하고자 하는 비율값을 입력
result = downscale(sample, 1280)


cv2.waitKey(0)
cv2.destroyAllWindows()

 

현재 이미지의 기본크기 그대로 불러오기 위해서는 1280 값 입력

 

반응형

 

scale 500 입력시

scale 300 입력시

 

 

 

예외처리) 만약 1280보다 큰값을 입력하면 예외처리 프린터문. 0보다 작을경우 에러발생

 

반응형
반응형

파이참을 이용해 개발환경을 구축하는 방법은 아래 참고.

https://ansan-survivor.tistory.com/134

 

Pycharm(파이참)을 이용하여 Python 개발환경 구축하기

파이참은 파이썬 개발을 편리하게 하는 많은 기능을 제공하는 툴이다. https://www.jetbrains.com/pycharm/download/#section=windows Download PyCharm: Python IDE for Professional Developers by JetBrains Do..

ansan-survivor.tistory.com

 

 

파이썬 오픈소스 영상처리 라이브러리인 OpenCV는 모두가 쉽게 사용할 수 있다.

영상처리를 위해 라이브러리를 설치해야 하는데, 만약 설치가 되어있지 않다면 파이참에서 cv2를 import했을 때 아래와 같이 빨간줄이 나온다. 해당 라이브러리가 없기 때문.

파이참에서는 손쉽게 바로 받을 수 있다.

 

1. 맨 아래 윈도우 터미널 창 클릭

 

2, 설치 명령(아래 코드)을 입력. (인터넷에서 가장 최신버전의 OpenCV가 설치된다.)

pip install opencv-python

반응형

(결과)

설치가 바로 진행되며, 완료 후 Package명과 버전을 보여준다.

그리고 이제 빨간줄이 없어짐을 볼 수 있다.

 

파이참에서 패키지를 설치하는 방법에 대한 자세한 사항은 아래참고

https://ansan-survivor.tistory.com/582

 

파이참(pycharm)에서 파이썬 패키지 라이브러리 설치하기

파이썬 패키지를 윈도우 cmd 터미널 창에서 설치할 수 있듯이, 파이참 내부에서도 해당 동일한 터미널 환경을 제공한다. 이를 이용해 pip 명령어로 패키지 설치가 가능하다. 또한 GUI환경으로 손쉽

ansan-survivor.tistory.com

 

반응형
반응형

이미지의 3포인트를 잡고 그 기준점을 옮김으로써 전체 이미지를 휘게 한다.

 

아래 3개의 라이브러리가 설치되어 있어야 하며, 이미지 jpg파일이 있어야 한다.

여기서는 'flippy.jpg' 이미지 사용

'''
라이브러리 설치
pip install opencv-python
pip install numpy
pip install matplotlib
'''

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 이미지 불러오기, 이미지 모양 추출
img = cv2.imread('flippy.jpg')      #   이미지 불러오기.
rows,cols,ch = img.shape            #   이미지 가로 세로
print(rows, cols, ch)

# 세 좌표점에 점 찍기
cv2.circle(img, (50, 50), 5, (255, 0, 0), -1)
cv2.circle(img, (200, 50), 5, (255, 0, 0), -1)
cv2.circle(img, (50, 200), 5, (255, 0, 0), -1)


# 원본 이미지의 좌표점 3지점(pts1) -> 휘게하려는 지점(pts2)
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])


# pts1와 pts2 좌표점을 이용해서 전체적으로 이미지 비틀기
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols, rows))


# plot(좌표점을 쉽게 볼 수 있는 플랫폼 제공)을 불러와서 보기
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('Output')
plt.show()

해당 코드를 실행시키면 아래와 같이 나오게 된다.

plot이라는 플랫폼을 이용하면 아래와 같이 이미지를 확대 축소 옮기기 등 기본 메뉴를 제공한다.

plot는 matplotlib 패키지를 설치해야 이용 가능하다.

반응형

 

 

 

반응형
반응형

아래 처럼 단순 별모양 이미지에서 외곽선, 최 내부의 꼭지점, 최 외곽의 블록성(Convexity)를 탐지 한다.

 

외곽선(Contour) 탐지

블록성 결함. (Convexity Defects) : Contour 라인에서 블록체가 되지 못하게 오목하게 들어간 부분 탐지

 

코드 사용을 위해서는 opencv, numpy 라이브러리를 설치해야 한다.

또한 위와같이 'star.jpg' 또는 아무 이미지를 사용해야 한다.

테스트한 이미지는 흑백의 구분이 편한 이미지를 사용했다.

다른 색상 있는 일반이미지는 threshold를 통해 흑백으로 원하는 부분을 추출해서 사용해야 잘 먹힌다.

반응형
import cv2
import numpy as np

img = cv2.imread('star.jpg')                                # 이미지 불러오기
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)              # 이미지 그레이 전환

ret, thresh = cv2.threshold(imgray, 120, 255, 0)                                         # 흑과 백으로 임계(threshold) 분할
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)   # contour(외곽선)를 찾아냄.(연속된 좌표점)

cv2.drawContours(img, contours, -1, (0, 255, 0), 2)     # contour(외곽선)을 그림, 초록색(0 255 0), 두께 2로
cnt = contours[0]                                       # cnt변수에 Contour[0]에 있는 2차원 연속된 좌표를 넣음.

# 윤곽(convex)정보 휙득
hull = cv2.convexHull(cnt, returnPoints=False)

defects = cv2.convexityDefects(cnt, hull)   #

for i in range(defects.shape[0]):

    s, e, f, d = defects[i, 0]
    start = tuple(cnt[s][0])
    end = tuple(cnt[e][0])
    far = tuple(cnt[f][0])

    # 바깥 최 외곽선을 이은 line 표시 (파랑색)
    cv2.line(img, start, end, [255, 0, 0], 2)

    # 내부의 꼭지점에 좌표점 표시 (빨간색)
    cv2.circle(img, far, 5, [0, 0, 255], -1)


cv2.imshow('img', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

이미지 확대 축소 관련

https://ansan-survivor.tistory.com/641

 

[Python OpenCV] 파이썬 이미지 회전하기, 확대 축소 하기

'mask.jpg' 라는 이미지를 파일로 만들어 사용했다. 파이썬 돌리는 코드와 동일한 디렉터리에 해당 파일이 있어야 한다. 이미지를 회전시키기. 이미지의 scale 조절하기 두 기능을 합쳐서 움직이기

ansan-survivor.tistory.com

 

 

 

반응형
반응형

 

'mask.jpg' 라는 이미지를 파일로 만들어 사용했다.

파이썬 돌리는 코드와 동일한 디렉터리에 해당 파일이 있어야 한다.

 

이미지를 회전시키기.

이미지의 scale 조절하기

두 기능을 합쳐서 움직이기 응용

 

import cv2

img = cv2.imread('mask.jpg', 0)     #   사용할 이미지 파일 흑백(0)
rows, cols = img.shape

flag = 0        # 스케일을 줄이고 키우고 줄이기 위한 플레그

scale = 1       # 초기값설정
angle = 0       # 초기 0도

while True:
    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale)
    dst = cv2.warpAffine(img, M, (cols, rows))

    angle = angle + 10      # 각을 10도 씩 회전
    if angle == 360:        # 0도~360도
        angle = 0

    if flag == 0:               # 스케일이 점점 줄어듦
        scale = scale - 0.01
        if scale <= 0:
            flag = 1

    if flag == 1:               # 스케일이 점점 늘어남
        scale = scale + 0.01
        if scale >= 1:
            flag = 0


    cv2.imshow('img', dst)      #   이미지 출력
    if cv2.waitKey(50) == 27:   #   esc 누르면 종료
        break

cv2.destroyAllWindows()

(결과)

반응형

 

단순 이미지 회전하는 코드는 아래 참고

https://ansan-survivor.tistory.com/954

 

[Python OpenCV] 파이썬 이미지 회전하기

원본영상을 90도 회전시키는 함수 회전각에 원하는 각을 넣어 회전 가능하다. (for문으면 계속 빙빙돌릴 수 있다) ''' made by 안산드레아스 이미지 회전하기 필요 패키지 : python-opencv ''' import cv2 '''

ansan-survivor.tistory.com

 

반응형
반응형

Mask를 이용하여 두 이미지를 합성하는 예제 코드이다.

단, 두 이미지의 크기가 같아야 작동한다. 만약 이미지 크기가 조금이라도 다르다면 오류를 일으킨다.

 

여기서는 flippy.jpg 라는 이미지와 'logo.jpg' 이미지 두개를 합성했다.

원리는 검정색 값은 RGB값이 (0, 0, 0) 이고, 흰색은 (255, 255, 255)이다.

그래서 그 어떤색도 흰색과 더해진다면 모두 흰색이 되고, 검정색은 아무 값이 없기에 합성된 이미지값들이 모두 더해진다. 아래 합성 이미지를 보면 기존 흰색인 부분은 그대로 흰색이고, 검정색인 부분은 녹색배경과 더해져서 그대로 녹색만 출력되었다.

나머지는 빨간색 + 녹색 = 주황색 등등 이런식으로 저런 결과가 나왔다.

 

import cv2

img1 = cv2.imread('flippy.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('logo.jpg', cv2.IMREAD_COLOR)

# 두 이미지 합성
img3 = cv2.add(img1, img2)

cv2.waitKey(1000)
cv2.imshow('flippy.jpg', img1)
cv2.imshow('logo.jpg', img2)
cv2.imshow('addtion', img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

반응형

 

(결과)

 

 

반응형
123

+ Recent posts