2021-12-31 vision 인식 & Data분석

ansunny1170·2021년 12월 30일
0

파이참 다운

  • 파이참 검색 후 다운
    파이썬 IDE임

  • 아나콘다 실행

  • conda update conda 입력

  • y입력

  • conda update --all 입력

  • y입력

  • python입력하고 3.9.7기억
    hello 잘 프린트 됨

  • exit()입력하고 나가기

  • conda create --name meta python=3.9.7입력하여 가상 환경 구성
    name이라는 옵션을 줘서 meta라는 이름의 python3.9.7을 사용하는 가상환경임

  • y누르면 아래와 같이 명령어 사용방법이 나온다.(base)를 보면 기본환경임을 알 수 있다.

  • conda activate meta 입력하여 (meta)로 변경
    이제 환경이 바뀌어서 import cv2는 안된다.

  • pip install opencv-python 입력하여 opencv 설치
    그리고 python으로 진입하여 import cv2하니 정상적으로 되는 것을 알 수 있다.

  • conda env list설치된 가상환경 확인 가능

  • 파이참 설치 진행

  • 파이참 실행

  • new project클릭
    바탕화면에 pycharm 폴더 생성후 경로 넣기
    아까 환경구성한 이름 meta가 맞으면 이대로 create

  • example1 정도로 생성

  • run 실행은 ctrl + shift + F10 누르면 run가능
    ctrl + F5 도 가능

영상처리 기본 예제

이미지 변형

숙제

#  이미지 반환 함수
def createImage(h_red):
    dst = cv2.bitwise_and(hsv, hsv, mask=h_red)
    # hsv 이미지와 hsv 이미지를 bitwise_and 연산 할것임, 연산 결과는 dst 변수에 담김
    # bitwise_and 연산의 마스크는 h_red (and 연산 할 부분)

    dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
    # hsv 연산이 끝난 이미지를 BGR 채널 이미지로 변경함
    return dst # 이미지 반환


src = cv2.imread("tomato.jpg")  # 이미지 가져옴
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)  # 색상 검출을 위해 HSV 채널로 변환

h, s, v = cv2.split(hsv)  # hue값 쓰기 위해 hsv 채널 이미지를 분리함

cv2.namedWindow("Palette")  # Palette 이름의 윈도우(창) 생성

# Palette 윈도우에 Hue 이름의 트랙바 생성, 최소값 0, 최대값 179, lambda x:x 이건 뭐지? -> 아무것도 안하는거
cv2.createTrackbar("Hue", "Palette", 0, 179, lambda x: x)
while True:
    # Palette 윈도우의 Hue 트랙바 움직일 때마다 값을 가져옴
    hue_val = cv2.getTrackbarPos("Hue", "Palette")

    h_red = cv2.inRange(h, 0, hue_val) # hue_val 사용하여 h_red 마스크 생성

    cv2.imshow("Palette", createImage(h_red)) # Palette 윈도우에 createImage 함수 반환 결과(이미지)를 보여줌

    if cv2.waitKey(33) & 0xFF == ord('q'): # 33미리세컨드마다 키입력 대기, q입력 받으면 종료
        break

cv2.destroyAllWindows()  # 모든 윈도우 release(메모리 헤제)

이미지 연산 p212

  • 나눗셈
  • 최댓값
  • 최소값
  • 최소/최대 위치 반환
  • 절댓값
  • 절댓값 차이
  • 비교(비교조건에 맞으면 255반환)
  • 선형 방적식 해 찾기
  • 각 요소별 비트 단위 연산
    bit는 8자릿수이다. 1은 0000 0001이기 때문에 홀수와는 무조건 and연산자 true를 반환한다.

흐림 효과

  • 커널과 고정점
    커널: 특정 픽셀과 해당 픽셀 주변을 포함한 작은 크기의 공간, 신호 처리에서는 필터 라고도 함
    고정점: 컨벌루션된 값을 할당한 지점
    컨벌루션: 원 픽셀을 특정 커널(필터)를 이용해 연산 하여 새로운 픽셀을 만들어 내는 것

  • 블러링(blurring) 또는 스무딩(smootihing)
    원본 이미지

    bilateralFilter 적용후

  • 단순흐림
    dst = cv2.blur(src, ksize, anchor = None, borderType = None)

  • 중간값
    dst = cv2.medianBlur(src, ksize)

  • 가우시안
    dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY = None, borderType = None)

import cv2

src = cv2.imread("crescent.jpg")

dst = cv2.GaussianBlur(src, (7,7), 0, 0, borderType = None)

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

원본 이미지

  • 양방향 필터
    dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst = None, BorderType = None)

  • 날카롭게.. sharpening

src = cv2.imread("Car.png")
cv2.imshow('src', src)
sharpening_mask = np.array([[0,-1,0], [-1,5,-1],[0,-1,0]])
dst = cv2.filter2D(src, -1, sharpening_mask)
cv2.imshow("dst", dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


이미지 변환

확대&축소

  • 이미지 피라미드
    이미지 확대/축소 (업샘플링/다운샘플링)
src = cv2.imread("ferris-wheel.jpg")
dst = src.copy()

for i in range(3):
    dst = cv2.pyrDown(dst)
    #피라미드는 무조건 2배 규칙이 있어서 여러번 호출 해야 한다.

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destoyAllWindows()

이미지 크기 조절

  • resize
    dst = cv2.resize(src, dsize, fx = None, fy = None, interpolation = None)
    dsize는 (x,y)형식이다.
src = cv2.imread("car.png")

dst = src[280:310, 240:405]
dst = cv2.resize(dst, dsize=(256,256), interpolation = cv2.INTER_NEAREST)

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

이미지 변환 실습

import cv2
#  이미지 반환 함수
import numpy as np


def createImage(h_red):
    dst = cv2.bitwise_and(hsv, hsv, mask=h_red)
    # hsv 이미지와 hsv 이미지를 bitwise_and 연산 할것임, 연산 결과는 dst 변수에 담김
    # bitwise_and 연산의 마스크는 h_red (and 연산 할 부분)

    dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
    # hsv 연산이 끝난 이미지를 BGR 채널 이미지로 변경함
    return dst # 이미지 반환

# 컬러 이미지
src = cv2.imread("tomato.jpg")  # 이미지 가져옴
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)  # 색상 검출을 위해 HSV 채널로 변환
# print('hsv: ',hsv.shape)
# 그레이 이미지
gray_src = cv2.imread("tomato.jpg",0)
# print('gray_src: ',gray_src.shape)

h, s, v = cv2.split(hsv)  # hue값 쓰기 위해 hsv 채널 이미지를 분리함
x, y = 0,0

cv2.namedWindow("Palette")  # Palette 이름의 윈도우(창) 생성

# Palette 윈도우에 Hue 이름의 트랙바 생성, 최소값 0, 최대값 179, lambda x:x 이건 뭐지? -> 아무것도 안하는거
cv2.createTrackbar("Hue", "Palette", 0, 179, lambda x: x)
while True:
    # Palette 윈도우의 Hue 트랙바 움직일 때마다 값을 가져옴
    hue_val = cv2.getTrackbarPos("Hue", "Palette")
    val_Val = round(cv2.getTrackbarPos("Hue", "Palette") / 358)

    # val_Val = 179 - cv2.getTrackbarPos("Hue", "Palette")
#
#     _, binary = cv2.threshold(gray_src, val_Val, 255, cv2.THRESH_BINARY) #OTSU

    h_red = cv2.inRange(h, 0, hue_val)  # hue_val 사용하여 h_red 마스크 생성
    # print('h_red: ', h_red.shape)
    CCC = (createImage(h_red))
    # print('CCC: ', CCC.shape)
    gray_src = h_red
    binary = cv2.adaptiveThreshold(gray_src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 33, val_Val)
    # print('binary: ', binary.shape)
    gray = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
    # print('gray: ',gray.shape)

    # CCC = (createImage(h_red))
    c = np.vstack((CCC, gray))
    cv2.imshow("Palette", c) # Palette 윈도우에 createImage 함수 반환 결과(이미지)를 보여줌

    cv2.moveWindow("Palette", x, y)
    key = cv2.waitKey(33) # 키보드 입력을 무한 대기, 8비트 마스크 처리
    if key == ord('a'):         # 'a' 키이면 좌로 이동
        x -= 100
    elif key == ord('s'):       # 's' 키이면 아래로 이동
        y += 100
    elif key == ord('w'):       # 'w' 키이면 위로 이동
        y -= 100
    elif key == ord('d'):       # 'd' 키이면 우로 이동
        x += 100
    elif key == ord('q') or key == 27: # 'q' 또는 'esc'이면 종료
        break
    cv2.moveWindow("Palette", x, y) # 새로운 좌표로 이동

    if cv2.waitKey(33) & 0xFF == ord('q'): # 33미리세컨드마다 키입력 대기, q입력 받으면 종료
        break
    elif cv2.waitKey(33) & 0xFF == 27: # 33미리세컨드마다 키입력 대기, ESC입력 받으면 종료
        break


cv2.destroyAllWindows()  # 모든 윈도우 release(메모리 헤제)
강사님 코드
import cv2
import numpy as np


def createImage(lower_mask, upper_mask, threshold):
    complete_mask = cv2.addWeighted(lower_mask, 1.0, upper_mask, 1.0, 0.0)
    dst = cv2.bitwise_and(hsv, hsv, mask=complete_mask)
    dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)

    gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)
    binary = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
    dst = np.vstack((dst, binary))

    return dst


src = cv2.imread("tomato.jpg")
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

h, s, v = cv2.split(hsv)
window_x, window_y = 0, 0

cv2.namedWindow("Palette", flags=cv2.WINDOW_NORMAL)
cv2.createTrackbar("lower_mask_min_value", "Palette", 0, 179, lambda x: x)
cv2.createTrackbar("lower_mask_max_value", "Palette", 5, 179, lambda x: x)
cv2.createTrackbar("upper_mask_min_value", "Palette", 170, 179, lambda x: x)
cv2.createTrackbar("upper_mask_max_value", "Palette", 179, 179, lambda x: x)

cv2.createTrackbar("threshold", "Palette", 127, 255, lambda x: x)

while True:
    lower_mask_min_value = cv2.getTrackbarPos("lower_mask_min_value", "Palette")
    lower_mask_max_value = cv2.getTrackbarPos("lower_mask_max_value", "Palette")

    upper_mask_min_value = cv2.getTrackbarPos("upper_mask_min_value", "Palette")
    upper_mask_max_value = cv2.getTrackbarPos("upper_mask_max_value", "Palette")

    threshold = cv2.getTrackbarPos("threshold", "Palette")

    lower_mask = cv2.inRange(h, lower_mask_min_value, lower_mask_max_value)
    upper_mask = cv2.inRange(h, upper_mask_min_value, upper_mask_max_value)

    cv2.imshow("Palette", createImage(lower_mask, upper_mask, threshold))

    key = cv2.waitKey(33)

    if key == ord('a'):
        window_x -= 10
    elif key == ord('s'):
        window_y += 10
    elif key == ord('w'):
        window_y -= 10
    elif key == ord('d'):
        window_x += 10
    elif key == ord('q') or key == 27:  # 'q' 이거나 'esc' 이면 종료
        break
        cv2.destroyAllWindows()
    cv2.moveWindow("Palette", window_x, window_y)  # 안배움

cv2.destroyAllWindows()

대칭&회전

import math
import cv2

src = cv2.imread("glass.jpg")

height, width, _ = src.shape
center = (width / 2, height / 2)
angle = 90
scale = 0.5 # 이미지 회전 후 비율 조정
matrix = cv2.getRotationMatrix2D(center, angle, scale)

radians = math.radians(angle)
sin = math.sin(radians)
cos = math.cos(radians)
bound_w = int((height * scale * abs(sin)) + (width * scale * abs(cos)))
bound_h = int((height * scale * abs(cos)) + (width * scale * abs(sin)))

matrix[0, 2] += ((bound_w / 2) - center[0])
matrix[1, 2] += ((bound_h / 2) - center[1])

dst = cv2.warpAffine(src, matrix, (bound_w, bound_h))

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

기하학적 변환

인위적으로 확대, 축소, 위치 변경, 회전, 왜곡 등 형태 변환

  • 아핀변환
    dst = cv2.warpAffine(src, M, dsize, dst = None, flags....)
    입력 이미지, 아핀 맵 행렬, 출력 이미지 크기, 출력 이미지, 보간법, 테두리 외삽법, 테두리 색상
  • 원근변환
import numpy as np
import cv2

src = cv2.imread("clouds.jpg")

cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
height, width, _ = src.shape # height, width = src.shape[:2]

pts1 = np.float32([[0,0], [0, height], [width,0], [width,height]])
pts2 = np.float32([[300,300], [0, height-200], [800,200], [width-100,height-100]])

matrix = cv2.getPerspectiveTransform(pts1, pts2)

dst = cv2.warpPerspective(src, matrix, (width, height))

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

import numpy as np
import cv2

src = cv2.imread("clouds.jpg")

cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
height, width, _ = src.shape # height, width = src.shape[:2]

cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
cv2.namedWindow('src', flags = cv2.WINDOW_NORMAL)

cv2.circle(src, (0,0), 10, (255,0,0), 10) # B
cv2.circle(src, (0,height), 10, (0,255,0), 10) # G
cv2.circle(src, (width,0), 10, (0,0,255), 10) # R
cv2.circle(src, (width,height), 10, (0,255,255), 10) # Y

cv2.imshow('src', src)

pts1 = np.float32([[0,0], [0, height], [width,0], [width,height]])
pts2 = np.float32([[300,300], [0, height-200], [800,200], [width-100,height-100]])

matrix = cv2.getPerspectiveTransform(pts1, pts2)

dst = cv2.warpPerspective(src, matrix, (width, height))

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

모폴로지 변환

구조요소 생성 함수는 커널의 형태(shape)를 설정할 수 있으며, 직사각형 십자가 타원 모양으로 구조 요소를 생성한다.

  • 팽창
  • 침식
import cv2

src = cv2.imread("dandelion.jpg", cv2.IMREAD_GRAYSCALE)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5), anchor=(-1,-1))
# 타원, 사이즈, 고정점
dst = cv2.erode(src, kernel, iterations=1) #침식 반복 횟수

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

profile
공정 설비 개발/연구원에서 웹 서비스 개발자로 경력 이전하였습니다. Node.js 백엔드 기반 풀스택 개발자를 목표로 하고 있습니다.

0개의 댓글