Others
OpenCV기초
에스더
2021. 3. 24. 17:00
사용된 이미지는 영상처리리에서 시험용 이미지로 자주 쓰이고 있는 lena image이고 이를 sample.jpeg에 저장하여 사용하였다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
1. 이미지 불러오기
img = cv2.imread('sample.jpeg', cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
2. 이미지를 흑백으로 변경하고 저장
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray_img, cmap='gray', vmin=0, vmax=255)
plt.show()
cv2.imwrite('gray_img.jpg',gray_img)
3. 이미지를 200x100으로 리사이즈
new_size_img = cv2.resize(img, dsize=(200,100))
plt.imshow(new_size_img)
plt.show()
4. 여자를 중심으로 crop하고 좌우 반전
img_cropped = img[13:, 120:262].copy()
img_flipped = cv2.flip(img_cropped, 1)
plt.imshow(img_flipped)
plt.show()
5. 이미지를 hsv채널로 변경하고 시각화
img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
plt.imshow(img_hsv)
plt.show()
6. Laplacian Filter 적용
laplacian_img = cv2.Laplacian(img,cv2.CV_64F)
plt.imshow(laplacian_img.astype(np.uint8))
plt.show()
7. Canny Edge Detection 적용
canny_img = cv2.Canny(img, 100, 200)
plt.imshow(canny_img)
plt.show()
8. Gaussian Blur 적용 (위)
blurred_img = cv2.GaussianBlur(img,(5,5), 0)
plt.imshow(blurred_img),
plt.show()
plt.imshow(img)
plt.show()
9. Threshold 적용
- 원본사진
_, threshold_img = cv2.threshold(img, 75, 255, cv2.THRESH_BINARY)
plt.imshow(threshold_img)
plt.show()
- 흑백사진
_, threshold_img = cv2.threshold(gray_img, 75, 255, cv2.THRESH_BINARY)
plt.imshow(threshold_img)
plt.show()
- 함수를 사용하지 않고 threshold를 적용해 본다면
thre_img = gray_img.flatten()
for i in range(len(thre_img)):
if thre_img[i] >75:
thre_img[i] = 255
else:
thre_img[i] = 0
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thre_img = np.reshape(thre_img, gray_img.shape)
plt.imshow(thre_img)
10. 여자 주위에 초록색 박스 그리기
rectangle_img = cv2.rectangle(img.copy(), (120, 13), (262, 175), (0,255,0), thickness=3)
plt.imshow(rectangle_img)
11. 여자 모자의 파란색 깃털을 노란색으로 바꾸기
- 깃털 부분에만 threshold를 적용하기 위해 이미지 crop
feather = cv2.rectangle(img.copy(), (110, 62), (220, 225), (0,0,255), thickness=2)
plt.imshow(feather)
plt.show()
img_crop = img.copy()
feather = img_crop[61:225, 105:220].copy()
plt.imshow(feature)
plt.show()
- 각 컬러 채널에 threshold를 적용해가며 확인
plt.imshow(feather[:,:,0] < 50)
plt.show()
plt.imshow(feather[:,:,1] < 60)
plt.show()
plt.imshow(feather[:,:,2] < 50)
plt.show()
- 이를 적절히 조합하여
feather_copy = feather.copy()
feather0 = list(feather_copy[:,:,0].flatten())
feather1 = list(feather_copy[:,:,1].flatten())
feather2 = list(feather_copy[:,:,2].flatten())
empty = [0]*164*115
for i in range(len(feather0)):
if (feather0[i]<65 and feather2[i]>40):
if feather0[i] + 150 <255:
feather0[i] += 150
else:
feather0[i] == 255
if feather1[i] + 150 <255:
feather1[i] += 150
else:
feather1[i] == 255
if feather2[i] - 100 >0:
feather2[i] -= 100
else:
feather2[i] = 0
feather0 = np.reshape(feather0, feather_copy.shape[:2])
feather1 = np.reshape(feather1, feather_copy.shape[:2])
feather2 = np.reshape(feather2, feather_copy.shape[:2])
f = np.full(feather_copy.shape, (0, 0, 0))
f[:,:,0] = feather0
f[:,:,1] = feather1
f[:,:,2] = feather2
plt.imshow(f)
plt.show()
plt.imshow(feather)
plt.show()
- 깃털이 노란색으로 바뀐 사진을 가지고 전체 사진에서 같은 부분을 대체하면 완벽하지는 않지만 깃털에 노란기가 돌게 변경 가능
new_img = img.copy()
new_img[61:225, 105:220] = f.copy()
plt.imshow(new_img)
plt.show()
plt.imshow(img)
plt.show()