1. Blur, Canny, Erode, Dilation 정의
Blur

- 이미지에서 잡음을 제거하거나 디테일을 흐리게 만드는 작업을 수행합니다.
- 이는 잡음을 줄이고, 이미지의 부드러운 효과를 만들어 더 나은 시각적 결과를 얻기 위해 사용됩니다.
Canny

- 이미지에서 경계를 감지합니다.
- 이미지에서 물체의 윤곽을 찾거나 객체를 추출하는 데 사용됩니다.
- 엣지 감지 알고리즘 중에서 가장 널리 사용되는 것 중 하나입니다.
Erode

- 이미지에서 물체의 외부 경계를 침식시키는 작업입니다.
- 작은 객체나 노이즈를 제거하거나 이미지의 크기를 줄이기 위해 사용됩니다.
Dilation

- 이미지에서 물체의 외부 경계를 팽창시키는 작업입니다.
- 작은 구멍을 메우거나 물체를 확장시키는 데 사용됩니다. 이미지의 작은 구멍을 메우거나 물체를 두껍게 만들어 강조할 때 유용합니다.
사용 코드
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('data/lena.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernal = np.ones((5,5), np.uint8)
blur = cv2.blur(img, (5, 5))
canny = cv2.Canny(img, 100, 200)
dilation = cv2.dilate(canny, kernal, iterations = 1)
eroded = cv2.erode(dilation, kernal, iterations = 1)
cv2.imshow('Blur', blur)
cv2.imshow('Canny', canny)
cv2.imshow('Dilation', dilation)
cv2.imshow('Erode', eroded)
cv2.waitKey()
cv2.destroyAllWindows()
2. 여러 가지 Affine
- Affine 변환은 이미지의 기하학적 변형을 다루는 데 사용되는 중요한 툴 중 하나이다. Affine 변환을 이용하면 이미지를 회전하거나, 크기를 조절하거나, 이동시키는 등의 작업을 할 수 있다.
- Affine 변환은 선의 평행성은 유지하면서 이미지를 변형한다. 기본적으로 affine 변환은 2D 좌표계에서의 변환을 의미하며, 3x3 변환 행렬을 사용한다.
- OpenCV에서는 cv2.getAffineTransform()과 cv2.warpAffine() 함수를 주로 사용하여 affine 변환을 구현한다.
- 이동(Translation):
- 모든 점을 일정한 양만큼 이동시키는 변환입니다. 이동은 각 축마다 움직이는 거리를 지정하여 이루어집니다.
- 회전(Rotation):
- 도형을 중심을 기준으로 회전시키는 변환입니다. 회전 각도에 따라 도형이 시계 방향 또는 반시계 방향으로 회전됩니다.
- 크기 변경(Scaling):
- 도형의 크기를 변경하는 변환입니다. 각 축별로 크기를 조절하여 도형을 확대 또는 축소합니다.
- 전단(Shear):
- 도형을 한 축에 대해 기울이는 변환입니다. 이 변환은 각 축에 대해 기울기 값을 지정하여 이루어집니다.
- 아핀 변환(Affine Transformation):
- 이동, 회전, 크기 변경 및 전단을 조합하여 어떤 도형을 다른 도형으로 변환하는 변환이며, 이 변환은 직선은 직선으로, 평행선은 평행선으로 유지됩니다.
3. Contour란?
- Contour는 동일한 색상이나 강도를 가진 영역의 경계선을 연결한 선이다.
- 이미지에서 객체를 구분하거나 형태를 분석하는 데 사용된다.
- OpenCV에서는 Contour를 찾음으로써 객체의 크기, 모양, 위치 등을 파악할 수 있으며, 이를 통해 객체 인식이나 분류 작업에 활용할 수 있다.
윤곽선은 주로 다음과 같은 작업에 사용됩니다.

- 객체 검출: 윤곽선을 사용하여 이미지에서 객체를 감지하고 분리합니다.
- 특징 추출: 객체의 형태, 크기 및 방향과 같은 특징을 추출하기 위해 사용됩니다.
- 객체 분할: 이미지에서 개별 객체를 분할하고 분리합니다.
- 객체 식별: 객체를 구분하고 식별하기 위해 사용됩니다.
4. 노트북 도형찾기 퀴즈 정답 및 결과사진
- 내 노트북 사진 열기(내거는 아니지만)

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('data/notebook.jpg')
img = cv2.resize(img, (1000, 750))
cv2.imshow('Img', img)
cv2.waitKey()
cv2.destroyAllWindows()
- 내 노트북 사진 canny로 외각선 따기

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('data/notebook.jpg')
img = cv2.resize(img, (1000, 750))
canny = cv2.Canny(img, 100, 200)
cv2.imshow('Img', canny)
cv2.waitKey()
cv2.destroyAllWindows()
- 내 노트북 사진 erode dilation blur 등을 이용해서 외각선 잘 뜨게 해보기

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('data/notebook.jpg')
img = cv2.resize(img, (1000, 750))
canny = cv2.Canny(img, 100, 200)
blur = cv2.blur(img, (5, 5))
blured_canny = cv2.Canny(blur, 100, 200)
dilation = cv2.dilate(canny, kernal, iterations = 1)
eroded = cv2.erode(dilation, kernal, iterations = 1)
cv2.imshow('img', eroded)
cv2.waitKey()
cv2.destroyAllWindows()
- 노트북 사진 삐딱한거 projective 써서 직사각형 만들기

import cv2
import numpy as np
# 이미지 읽기
image = cv2.imread('data/notebook.jpg')
# 이미지 크기를 조정합니다.
scale_percent = 25 # 이미지 크기를 조절할 비율
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
image = cv2.resize(image, (width, height))
# 수정된 꼭지점 좌표 정의
pts_original = np.float32([[460, 60], [790, 460], [130, 280], [560, 740]])
# 목표로 하는 직사각형의 네 꼭지점 좌표 정의
pts_target = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
# 변환 행렬 계산
matrix = cv2.getPerspectiveTransform(pts_original, pts_target)
# 이미지를 변환하여 직사각형 형태로 만듦
result = cv2.warpPerspective(image, matrix, (width, height))
# 결과 이미지를 축소하여 출력
scale_percent_result = 50 # 결과 이미지 크기를 조절할 비율
width_result = int(result.shape[1] * scale_percent_result / 100)
height_result = int(result.shape[0] * scale_percent_result / 100)
result = cv2.resize(result, (width_result, height_result))
# 꼭짓점 녹색으로 표시
for point in pts_original:
pt = tuple(map(int, point)) # 정수형으로 변환
cv2.circle(image, pt, 5, (0, 255, 0), -1)
# 결과를 출력
cv2.imshow('Original Image', image)
cv2.imshow('Transformed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
- contour 하기 / 노트북이 무슨 도형에 가까운지 검출하고 검출한 결과 노트북 근처에 띄우기

import cv2
import numpy as np
kernel = np.ones((5,5), np.uint8)
img = cv2.imread('data/notebook.jpg')
imgresize = cv2.resize(img, (1000, 750))
imgGrey = cv2.cvtColor(imgresize, cv2.COLOR_BGR2GRAY)
_, thrash = cv2.threshold(imgGrey, 200, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thrash, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
print(len(contours))
cv2.imshow("img", imgGrey)
for contour in contours:
area = cv2.contourArea(contour)
if area > 100000: # 면적이 1000 이상인 윤곽선에 대해서만 텍스트를 넣습니다.
approx = cv2.approxPolyDP(contour, 0.1 * cv2.arcLength(contour, True), True)
cv2.drawContours(imgresize, [approx], 0, (0, 0, 0), 5)
x = approx.ravel()[0]
y = approx.ravel()[1] - 5
if len(approx) == 3:
cv2.putText(imgresize, "Triangle", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255))
elif len(approx) == 4:
x1, y1, w, h = cv2.boundingRect(approx)
aspectRatio = float(w)/h
print(aspectRatio)
if 0.99 <= aspectRatio <= 1.01:
cv2.putText(imgresize, "Square", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255))
else:
cv2.putText(imgresize, "Rectangle", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255))
elif len(approx) == 5:
cv2.putText(imgresize, "Pentagon", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255))
elif len(approx) == 10:
cv2.putText(imgresize, "Star", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255))
else:
cv2.putText(imgresize, "Circle", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255))
cv2.imshow("shapes", imgresize)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. haar cascade란?
- Haar Cascade는 객체 검출을 위한 기계 학습 기반의 접근 방식 중 하나다.
- 특히 얼굴 검출에 많이 사용되며, 여러 단계의 분류기를 거쳐 객체를 검출한다.

import cv2
faceCascade= cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
img = cv2.imread('data/lena.jpg')
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(imgGray,1.1,4)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('image', img)
cv2.waitKey()
cv2.destroyAllWindows()
6. 얼굴 모자이크 처리하는 웹캠 프로그램 만들기

import cv2
faceCascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=4)
for (x, y, w, h) in faces:
roi = frame[y:y+h, x:x+w]
factor = 10
small_roi = cv2.resize(roi, (w//factor, h//factor))
mosaic_roi = cv2.resize(small_roi, (w, h), interpolation=cv2.INTER_NEAREST)
frame[y:y+h, x:x+w] = mosaic_roi
cv2.imshow('Webcam Face Mosaic', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
'AI' 카테고리의 다른 글
Chat gpt로 볼링 점수 계산하기 (0) | 2024.06.26 |
---|---|
테트리오 랭크 예측 (0) | 2024.06.12 |
과제 (0) | 2024.04.03 |
영상인식과 opencv (0) | 2024.03.20 |
[인공지능] 인공지능 (0) | 2024.03.06 |