틀릴 수 있음 주의
01
(1) (y,x)=(4,4)
fy'(4,4)=1x-1+3x-2+3x-1+1x1+1x2+1x1 = -6
fx'(4,4)=1x-1+3x1+1x-2+3x2+1x-1+1x1 = 6
s(4,4)= 루트(6^2+(-6)^2) =8.485
d(4,4)=arctan(-1)=-45도
(2) (y,x)=(5,2)
fy'(5,2)=0
fx'(5,2)=0
s(5,2)=0
d(0,0)=arctan(0)=0
02
03
임계값을 정하고 해당 임계값을 넘은 에지 강도인 에지 점들의 집합의 방향을 적용해 곡선을 찾는다.
해당 작업을 RANSAC로 반복
04
아니오
해당절에서 설명한 에지 검출 알고리즘들은 명암 변화에만 의존하여 구분이 힘들다
05
뇌이미지 분석, 다변량 패턴 분석
06
5번 반복한다는 것이다.1로 바꾸면 undefitting
07
샤르 에지 연산자는 소벨보다 더 정확한 미분 계산을 수행한다.
ex) 3x3샤르필터 마스크
-3 | 0 | 3 |
-10 | 0 | 10 |
-3 | 0 | 3 |
-3 | -10 | -3 |
0 | 0 | 0 |
3 | 10 | 3 |
훨씬 선명하다.
import cv2 as cv
img=cv.imread("../source/pooh.jpg")
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
grad_x=cv.Sobel(gray,cv.CV_32F,1,0,ksize=3)
grad_y=cv.Sobel(gray,cv.CV_32F,0,1,ksize=3)
sobel_x=cv.convertScaleAbs(grad_x)
sobel_y=cv.convertScaleAbs(grad_y)
edge_strength=cv.addWeighted(sobel_x,0.5,sobel_y,0.5,0)
cv.imshow("Original",gray)
cv.imshow("sobelx",sobel_x)
cv.imshow("sobely",sobel_y)
cv.imshow("edge strength",edge_strength)
cv.waitKey()
cv.destroyAllWindows()
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('../source/pooh.jpg', cv2.IMREAD_COLOR)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 샤르 필터 적용
sharr_x = cv2.Scharr(gray_image, cv2.CV_64F, 1, 0)
sharr_y = cv2.Scharr(gray_image, cv2.CV_64F, 0, 1)
# 에지 크기
abs_sharr_x = cv2.convertScaleAbs(sharr_x)
abs_sharr_y = cv2.convertScaleAbs(sharr_y)
# 에지 결합
combined_sharr = cv2.addWeighted(abs_sharr_x, 0.5, abs_sharr_y, 0.5, 0)
# IMSHOW
plt.figure(figsize=(10, 7))
plt.subplot(1, 3, 1)
plt.title('Original Image')
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.subplot(1, 3, 2)
plt.title('Sharr Edge X')
plt.imshow(abs_sharr_x, cmap='gray')
plt.subplot(1, 3, 3)
plt.title('Sharr Edge Y')
plt.imshow(abs_sharr_y, cmap='gray')
plt.figure()
plt.title('Combined Sharr Edge')
plt.imshow(combined_sharr, cmap='gray')
plt.show()
08
image : 입력 이미지(그레이 스케일)
edges : 출력 저장
threshold1 : 하위 임계값. 이보다 낮은 경계 강도는 무시
threshold2 : 상위 임계값. 이보다 높은 경계 강도는 강한 에지로 간주
apertureSize : 소벨 연산자 커널 크기. 기본3, 보통 홀수 크기
L2gradient : (기본값은 False)
False --> L1 노름 사용(절대값 합)
True --> L2 노름 사용(제곱합의 루트)
09
compactress가 작을수록 overfitting
n_segments 클수록 사각형 개수가 많아진다(즉 사각형의 크기는 작아짐)
import skimage
import numpy as np
import cv2 as cv
img=skimage.data.coffee()
cv.imshow("Coffee",cv.cvtColor(img,cv.COLOR_RGB2BGR))
#compactness 20
slic1=skimage.segmentation.slic(img,compactness=20,n_segments=600)
sp_img1=skimage.segmentation.mark_boundaries(img,slic1)
sp_img1=np.uint8(sp_img1*255.0)
#compactness 40
slic2=skimage.segmentation.slic(img,compactness=40,n_segments=600)
sp_img2=skimage.segmentation.mark_boundaries(img,slic2)
sp_img2=np.uint8(sp_img2*255.0)
#display
cv.imshow("Super pixels(compact 20)",cv.cvtColor(sp_img1,cv.COLOR_RGB2BGR))
cv.imshow("Super pixels(compact 40)",cv.cvtColor(sp_img2,cv.COLOR_RGB2BGR))
cv.waitKey()
cv.destroyAllWindows()
10
import cv2 as cv
import numpy as np
img=cv.imread('../source/pooh.jpg')
img_show=np.copy(img)# 붓 칠할 영상
mask=np.zeros((img.shape[0],img.shape[1]),np.uint8)
mask[:,:]=cv.GC_PR_BGD# 모든 화소를 배경일 것 같음으로 초기화
BrushSiz=9# 붓 크기
LColor,RColor=(255,0,0),(0,0,255) # 파란색(물체)과 빨간색(배경)
def painting(event,x,y,flags,param):
if event==cv.EVENT_LBUTTONDOWN:
cv.circle(img_show,(x,y),BrushSiz,LColor,-1)
cv.circle(mask,(x,y),BrushSiz,cv.GC_FGD,-1)
elif event==cv.EVENT_RBUTTONDOWN:
cv.circle(img_show,(x,y),BrushSiz,RColor,-1)
cv.circle(mask,(x,y),BrushSiz,cv.GC_BGD,-1)
elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_LBUTTON:
cv.circle(img_show,(x,y),BrushSiz,LColor,-1)
cv.circle(mask,(x,y),BrushSiz,cv.GC_FGD,-1)
elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_RBUTTON:
cv.circle(img_show,(x,y),BrushSiz,RColor,-1)
cv.circle(mask,(x,y),BrushSiz,cv.GC_BGD,-1)
cv.imshow('Painting',img_show)
cv.namedWindow('Painting')
cv.setMouseCallback('Painting',painting)
def ApplyGrabCut(img,mask):
cv.grabCut(img,mask,None,background,foreground,5,cv.GC_INIT_WITH_MASK)
mask2=np.where((mask==cv.GC_BGD)|(mask==cv.GC_PR_BGD),0,1).astype('uint8')
grab=img*mask2[:,:,np.newaxis]
cv.imshow('Grab cut image',grab)
while(True):# q누르면 결과 보여줌
if cv.waitKey(1)==ord('q'):
# GrabCut 적용
background=np.zeros((1,65),np.float64) # 배경 히스토그램 0으로 초기화
foreground=np.zeros((1,65),np.float64) # 물체 히스토그램 0으로 초기화
ApplyGrabCut(img,mask)
elif cv.waitKey(1)==ord('e'):
break
cv.destroyAllWindows()
'개발 > AI' 카테고리의 다른 글
[Pytorch] 07. 순환 신경망(RNN) (0) | 2024.08.05 |
---|---|
[OpenCV] 컴퓨터 비전과 딥러닝 / Ch05 / 연습 문제 (2) | 2024.08.03 |
[Pytorch] 06. 인공 신경망 (1) | 2024.08.02 |
[Pytorch] 05. 소프트맥스 회귀 (0) | 2024.07.30 |
[Pytorch] 04. 로지스틱 회귀 (0) | 2024.07.30 |