ํฐ๋ฏธ๋์์ ์๋์ ๊ฐ์ด ์ธํ
$ pip install pillow opencv-python matplotlib
ํ์ผ ์ค๋นํ๊ธฐ
$ mkdir -p ~/aiffel/python_image_proc/data
$ ln -s ~/data/* ~/aiffel/python_image_proc/data
$ ls ~/aiffel/python_image_proc/data # ํ์ผ ํ์ธ
์ค์ต์ฉ์ผ๋ก CIFAR-100 ์ด๋ฏธ์ง ๋ฐ์ดํฐ์
์ ์ฌ์ฉ
CIFAR-100
data = np.zeros([32,32,3],dtype=np.unit8)
=> ๋ฐ์ดํฐ๋ ๋ํ์ด ์ ๋ก์ 32,32,์ธ์ด์ฆ์ 3์์์ dtype์ด ๋ํ์ด
import numpy as np
from PIL import Image
data = np.zeros([32, 32, 3], dtype=np.uint8) # ๊ฐ๋ก, ์ธ๋กํฌ๊ธฐ, RGB
import numpy as np
from PIL import Image
data = np.zeros([32, 32, 3], dtype=np.uint8)
image = Image.fromarray(data, 'RGB')
image
data[:, :] = [255, 0, 0]
image = Image.fromarray(data, 'RGB')
image
์
import numpy as np
from PIL import Image
data = np.zeros([32,32,3], dtype=np.unit8)
image = Image.fromarry(data, 'RGB')
show(image)
img = Image.open(image_path)
new_image_path = os.getenv('HOME')+'jpg_pillow_practice.jpg'
img = img.convert('RGB')
img.save(new_image_path)
resized_image = img.resize((100,200))
resized_image = img.resize((100,200))
box = (300, 100, 600, 400)
region = img.crop(box)
# ์ด๋ฏธ์ง ํ์ฅ์๋ฅผ ์์๋ก wpg๋ก ๋ฐ๊ฟ wpg = w png
image_path = './python_image_proc/data/pillow_practice.wpg'
# ์ด๋ฏธ์ง ์ด๊ธฐ
img = Image.open(image_path)
img
import os
import pickle
from PIL import Image
dir_path = './python_image_proc/data/cifar-100-python' # ์ฌ๊ธฐ์ ์๋ ๊ฒ์
train_file_path = os.path.join(dir_path, 'train') # train์ ๋ค์ด๊ฐ์
with open(train_file_path, 'rb') as f:
train = pickle.load(f, encoding='bytes')
print(type(train))
print(train)
import pickle
my_list = ['a','b','c']
## Save pickle
with open("data.pickle","wb") as fw:
pickle.dump(my_list, fw)
## Load pickle
with open("data.pickle","rb") as fr:
data = pickle.load(fr)
print(data)
#['a', 'b', 'c']
๊ทผ๋ฐ wb๋ rb๋ ๋ญ๋
- pickle.dump(object, filepath) ๋ฅผ ์ด์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ฅ
- pickle.load(filepath) ๋ฅผ ์ด์ฉํ์ฌ ์ ์ฅ๋ ๋ณ์๋ฅผ ์ฝ๊ธฐ
- file open ์ mode ๋ฅผ โwbโ ์ โrbโ ๋ฅผ ์ ๋ ฅ
- 'wb ๋ write binary, rb ๋ read binary ๋ฅผ ์๋ฏธ
๋ค์
import os
import pickle
from PIL import Image
dir_path = './python_image_proc/data/cifar-100-python' # ์ฌ๊ธฐ์ ์๋ ๊ฒ์
train_file_path = os.path.join(dir_path, 'train') # train์ ๋ค์ด๊ฐ์
with open(train_file_path, 'rb') as f:
train = pickle.load(f, encoding='bytes')
print(type(train))
print(train)
<class 'dict'>
{b'filenames': [b'bos_ta........, 72, 69, 67]], dtype=uint8)}
๊ฒฐ๊ณผ๋ ๋๋ฌด ๋ง๋ค...
์ผ๋จ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ฌ๋์ ์ค๋ช ์ ๋ณด๋ฉด ๋์ ๋๋ฆฌ ํ์ผ๋ก ๋์ด ์๋ค๋
์ด๋ค ํค๊ฐ ์๋์ง ํ์ธํด๋ณด์
train.keys()
dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])
๊ฐ ํค๋ค์ด ๋ฌธ์์ด(str)์ด ์๋ b๋ก ์์ํ๋ bytes๋ก ๋์ด์๋ค!
์ผ๋จ ์ฒซ๋ฒ์งธ ์ ๋ณด์ธ ํ์ผ๋ช (b'filenames')์ ํ์ ์ ํ์ธํด๋ณด์
type(train[b'filenames'])
list
๋ฆฌ์คํธ๋ค.
์ 5๊ฐ๋ง ํ์ธํด๋ณด์
train[b'filenames'][0:5]
[b'bos_taurus_s_000507.png',
b'stegosaurus_s_000125.png',
b'mcintosh_s_000643.png',
b'altar_boy_s_001435.png',
b'cichlid_s_000031.png']
๋ฐ์ดํฐ ์ค๋ช ์ ๋ณด๋ฉด
Data: a 10000x3072 numpy array of uint8s. Each row of the array stores a 32x32 colour image. The first 1024 entries contain the red channel values, the next 1024 the green, and the final 1024 the blue. The image is stored in row-major order, so that the first 32 entries of the array are the red channel values of the first row of the image.
๋์ ๋๋ฆฌ b'data'์ ์๋ฐ, ๊บผ๋ด๋ณด์
train[b'data'][0:5]
array([[255, 255, 255, ..., 10, 59, 79],
[255, 253, 253, ..., 253, 253, 255],
[250, 248, 247, ..., 194, 207, 228],
[124, 131, 135, ..., 232, 236, 231],
[ 43, 32, 87, ..., 60, 29, 37]], dtype=uint8)
numpy ๋ฐฐ์ด์ด ๋์๋ค..
ํํ๋ฅผ ๋ณด์
train[b'data'][0].shape
(3072,)
3072๋ผ๋ ์ซ์๋ ๋นจ๊ฐ ์ด๋ก ํ๋ 3์ฑ๋ X 1024(=32 * 32)์ฉ ๊ฐ ํ์์ ํด๋นํ๋ ๊ฒ
- Numpy ๋ฐฐ์ด์ ์ reshapeํ๋ฉด ์ด๋ฏธ์ง ํ์ผ ์๋ณธ์ด ๋ณต๊ตฌ๋จ
image_data = train[b'data'][0].reshape([32, 32, 3], order='F') # order๋ฅผ ์ฃผ์ํ์ธ์!!
image = Image.fromarray(image_data) # Pillow๋ฅผ ์ฌ์ฉํ์ฌ Numpy ๋ฐฐ์ด์ Image๊ฐ์ฒด๋ก ๋ง๋ค์ด์
image # ํ๋ฉด์ ๋์ ๋ด
์๋ค!!
x์ถ๊ณผ y์ถ์ด ๋ค์ง์ด์ ๋์ด -> ์ถ์ ๋ฐ๊ฟ์ฃผ๋ ์์ ์ด ํ์
image_data = image_data.swapaxes(0, 1)
image = Image.fromarray(image_data)
image
import os
import pickle
from PIL import Image
import numpy
from tqdm import tqdm
dir_path = './python_image_proc/data/cifar-100-python'
train_file_path = os.path.join(dir_path, 'train')
# image๋ฅผ ์ ์ฅํ cifar-100-python์ ํ์ ๋๋ ํ ๋ฆฌ(images)๋ฅผ ์์ฑํฉ๋๋ค.
images_dir_path = './python_image_proc/cifar-images'
if not os.path.exists(images_dir_path):
os.mkdir(images_dir_path) # images ๋๋ ํ ๋ฆฌ ์์ฑ
# 32X32์ ์ด๋ฏธ์ง ํ์ผ 50000๊ฐ๋ฅผ ์์ฑํฉ๋๋ค.
with open(train_file_path, 'rb') as f:
train = pickle.load(f, encoding='bytes')
for i in tqdm(range(len(train[b'filenames']))):
filename = train[b'filenames'][i].decode()
data = train[b'data'][i].reshape([32, 32, 3], order='F')
image = Image.fromarray(data.swapaxes(0, 1))
image.save(os.path.join(images_dir_path, filename))
100%|โโโโโโโโโโ| 50000/50000 [00:24<00:00, 2011.90it/s]
import os
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
img_path = './python_image_proc/data/cv_practice.png'
img = cv.imread(img_path)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
lower_blue = np.array([100,100,100])
upper_blue = np.array([130,255,255])
mask = cv.inRange(hsv, lower_blue, upper_blue)
res = cv.bitwise_and(img, img, mask=mask)
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.show()
plt.imshow(cv.cvtColor(mask, cv.COLOR_BGR2RGB))
plt.show()
plt.imshow(cv.cvtColor(res, cv.COLOR_BGR2RGB))
plt.show()
>> ![](https://velog.velcdn.com/images%2Fpasianus%2Fpost%2Fc6fbdf3d-ff34-495e-af1d-e1da89627f03%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.27.17.png)
### ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
```python
import cv2 as cv
import numpy as np
OpenCV๋ pip ์ค์น์ opencv-python
import์์๋ cv2
OpenCV์ Numpy๋ ์ธ๋
img_path = './python_image_proc/data/cv_practice.png'
img = cv.imread(img_path)
ํ์ผ๋ก๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ์ฝ์ด์ ๋ฐํํด์ฃผ๋ ํจ์
OpenCV ๊ณต์ ๋ฌธ์ํ ์ฌ์ดํธ
# Convert BGR to HSV
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
OpenCV: Color Space Conversions
cvtColor์ ์ปฌ๋ฌ ์คํ์ด์ค ๋ณํ(convert)์ ์ํ ํจ์
# define range of blue color in HSV
lower_blue = np.array([100,100,100])
upper_blue = np.array([130,255,255])
์ํ๋ ์์ ์ถ์ถ
- HSV ์ ๊ณต๊ฐ์์ ์์(Hue) ๊ฐ 110~130 ์ฌ์ด, ์ฑ๋(Saturation) ๋ฐ ๋ช ๋(Value) ๊ฐ 50~255 ์ฌ์ด์ ์๋ค์ ํ๋์์ด๋ผ๊ณ ์ ์
HSV์ ๋ํด ์ดํด๊ฐ ํ์
- RGB ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ๋ฐ์ HSV ์ด๋ฏธ์ง๋ก ๋ณํํ๋ค.
- ์์์ ๋ฒ์์ ๋ฐ๋ผ ํน์ ์์์ ๊ฐ์ฒด๋ฅผ ์ถ์ถํ๋ ๋ง์คํฌ๋ฅผ ์์ฑํ๋ค.
- ์์ฑํ ๋ง์คํฌ์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ๊ณ์ฐํ์ฌ ํน์ ํ ์์์ ๊ฐ์ฒด๋ง ์ถ์ถ๋๋ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค.
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
๊ฐ๋ก 400, ์ธ๋ก 300 ํฝ์ ์ง๋ฆฌ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์๋ค๋ฉด, img๊ณผ hsv๋ ๊ฐ๊ฐ ํฝ์ ๋น BGR, HSV ์ธ ๊ฐ์ ์์ ์ฑ๋๋ณ ๊ฐ์ ๊ฐ์ง ํ ๊ธฐ ๋๋ฌธ์, 400 300 3์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ด์๊ณ , mask๋ ํฝ์ ๋ง๋ค 1 ๋๋ 0๋ง์ ๊ฐ์ผ๋ก ๊ฐ์ก๊ธฐ์ 400 300 ( 1)์ ํฌ๊ธฐ
์ผ์ชฝ์ด original frame์ผ๋ก mask๋ฅผ ๋ง๋ ๋ค 1์ ํฐ์์ผ๋ก, 0์ ๊ฒ์ ์ผ๋ก ํ์ํ๋ค๋ฉด, ์ ์ด๋ฏธ์ง์ ๊ฐ์ด๋ฐ์ ์๋ mask image์ ๋์ผ
์ด๋ฏธ์ง ๋ ์ฅ์ ๋ฐ์์ AND ๋นํธ ์ฐ์ฐ์ ํ๋ค๋ ๊ฑด๋ฐ, ์ฐ๋ฆฌ๋ ์ด ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒ ์๋๋ ๋ ์ฅ ๋ค ๊ฐ์ ์ด๋ฏธ์ง(img, img)๋ฅผ ๋ฃ์ด์ ๊ฒฐ๊ตญ ๋์ผํ ์ด๋ฏธ์ง๊ฐ ๋์ค๊ฒ ํฉ๋๋ค. ๋์ ์ค์ํ mask๋ฅผ ๊ฐ์ด ๋ฃ์ด์ค์, ํด๋น ์์ญ๋ง ๋ฐ์ค๋๋ก ํฉ๋๋ค. ๋ฐ์จ ์์ญ์ ์ ๊ณต์ ๋ฌธ์ ํ์ด์ง์ ํจ์ ์ค๋ช ์ ๋ฐ๋ผ dst๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ๊ทธ ์์, ์๋๋ฉด ์๋ก ๋น ๊ฒ์ ์ ์์ญ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐํ
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.show()
plt.imshow(cv.cvtColor(mask, cv.COLOR_BGR2RGB))
plt.show()
plt.imshow(cv.cvtColor(res, cv.COLOR_BGR2RGB))
plt.show()
๋ฐ์์จ ์ด๋ฏธ์ง img, ํ๋์์ธ ์์ญ๋ง ๊ณจ๋ผ๋ธ ๋ง์คํฌ mask, ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง์ ๋ง์คํฌ๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ res๋ฅผ ํ์
. plt ๋ก ๋ณด์ฌ์ฃผ์ง ์๊ณ cv ๋ก ์ด๋ฏธ์ง๋ฅผ ๋์ฐ๋ ๋ฐฉ๋ฒ
ํ์คํ ๊ทธ๋จ
- ์ด๋ฏธ์ง์์ ํฝ์ ๋ณ ์์ ๊ฐ์ ๋ถํฌ
- ํ์คํ ๊ทธ๋จ์ ํตํด, ๊ฐ ์ด๋ฏธ์ง์ ์์ ๋ถํฌ๋ฅผ ๋น๊ตํ์ฌ ์๋ก ์ ์ฌํ ์ด๋ฏธ์ง๋ฅผ ํ๋จํ๋ ์ฒ๋๋ก ์ฌ์ฉ
์์ ์์๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ฐฑ์ผ๋ก ๋ณํํ์ ๋ ๋ฐ๊ธฐ์ ๋ฐ๋ฅธ ํ์คํ ๊ทธ๋จ
์ฐ๋ฆฌ๋ RGB ๊ฐ ์ฑ๋๋ณ ๋ถํฌ๋ฅผ ์ฌ์ฉ
0~255 ์ฌ์ด ๊ฐ ๊ฐ์ ํด๋นํ๋ ํฝ์ ์ ๊ฐ์๋ฅผ ์ผ์ผ์ด ์ ์ฅํ๊ธฐ์๋ ๊ณ์ฐ๋์ด ๋ง์์ง๋ฏ๋ก, ๋จ์ํ์ ์ธก๋ฉด์์ ์ด๋ฅผ 4๊ฐ ๊ตฌ๊ฐ(0~63, 64~127, 128~191, 192~255)๋ก ๋๋์ด ํฝ์ ์ ์ธ๊ธฐ
- ํ์คํ ๊ทธ๋จ์ ์ค์ ๋ก ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด matplotlib๋ ์ค์น
- OpenCV๋ฅผ ํ์ด์ฌ์์ ๋ถ๋ฌ ์ธ ์ ์๋๋ก ํ๋ ํจํค์ง opencv-python ์ค์น
$ pip install opencv-python matplotlib
import os
import pickle
import cv2
import numpy as np
from matplotlib import pyplot as plt
from tqdm import tqdm
from PIL import Image
# ์ ์ฒ๋ฆฌ ์ ์์ฑํ๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
dir_path = './python_image_proc/'
train_file_path = os.path.join(dir_path, 'train')
images_dir_path = os.path.join(dir_path, 'cifar-images')
# ํ์ผ๋ช
์ ์ธ์๋ก ๋ฐ์ ํด๋น ์ด๋ฏธ์ง ํ์ผ๊ณผ ํ์คํ ๊ทธ๋จ์ ์ถ๋ ฅํด ์ฃผ๋ ํจ์
def draw_color_histogram_from_image(file_name):
image_path = os.path.join(images_dir_path, file_name)
# ์ด๋ฏธ์ง ์ด๊ธฐ
img = Image.open(image_path)
cv_image = cv2.imread(image_path)
# Image์ Histogram ๊ทธ๋ ค๋ณด๊ธฐ
f=plt.figure(figsize=(10,3))
im1 = f.add_subplot(1,2,1)
im1.imshow(img)
im1.set_title("Image")
im2 = f.add_subplot(1,2,2)
color = ('b','g','r')
for i,col in enumerate(color):
# image์์ i๋ฒ์งธ ์ฑ๋์ ํ์คํ ๊ทธ๋จ์ ๋ฝ์์(0:blue, 1:green, 2:red)
histr = cv2.calcHist([cv_image],[i],None,[256],[0,256])
im2.plot(histr,color = col) # ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ๋ ์ฑ๋ ์์๊ณผ ๋ง์ถฐ์ ๊ทธ๋ฆฝ๋๋ค.
im2.set_title("Histogram")
draw_color_histogram_from_image('adriatic_s_001807.png')
์ฐ๋ฆฌ๊ฐ ๋ง๋ค ๊ฒฐ๊ณผ๋ฌผ์ histogram_search.py๋ผ๋ Python ํ์ผ์ด๊ณ , ์ด ํ์ผ์ ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก ํ๋๋ฅผ ๋ช ๋ น์ค์์ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋น์ทํ ์ด๋ฏธ์ง๋ค์ ๊ณจ๋ผ ํ๋ฉด์ ํ์ํ๋ ๊ธฐ๋ฅ์ ์ํ
ํต์ฌ์
1. ์ปดํจํฐ์๊ฒ ๋น์ทํ ์ด๋ฏธ์ง๋ผ๋ ๊ฐ๋
์ ์ด๋ป๊ฒ ๊ตฌํํ๋๋
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋ถ๋ฌ์จ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋น์ทํ ์ด๋ฏธ์ง 5๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค.
- ๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์์ ์ข ๋ ๊ตฌ์ฒดํ
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋ถ๋ฌ์จ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋น์ทํ ์ด๋ฏธ์ง 5๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค.
3-1. ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์จ๋ค.
3-2. ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋น๊ตํ์ฌ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ๋งค๊ธด๋ค.
3-3. ์ ์ฌ๋ ์์์์ผ๋ก ์์ 5๊ฐ ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅธ๋ค.- ๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋ถ๋ฌ์จ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋น์ทํ ์ด๋ฏธ์ง 5๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค.
3-1. ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์จ๋ค.
3-2. ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋น๊ตํ์ฌ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ๋งค๊ธด๋ค.
3-2-1. ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ฌ์ด์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค.
3-2-2. ๊ณ์ฐ๋ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์์๋ฅผ ๋งค๊ธด๋ค.
3-2. ์ ์ฌ๋ ์์์์ผ๋ก ์์ 5๊ฐ ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅธ๋ค.- ๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์ ์ฌ๋๋ฅผ ํ์คํ ๊ทธ๋จ๋ผ๋ฆฌ ๋น๊ต
-> OpenCV์ ๊ธฐ๋ฅ์ ์ฌ์ฉ
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋ถ๋ฌ์จ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋น์ทํ ์ด๋ฏธ์ง 5๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค.
- 3-1. ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์จ๋ค.
- 3-2. ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋น๊ตํ์ฌ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ๋งค๊ธด๋ค.
- 3-2-1. ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ฌ์ด์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค.
- 3-2-1-1. ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ํ๋ํ๋ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.
- 3-2-1-2. OpenCV์ compareHist() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง ํ๋ํ๋์ ํ์คํ ๊ทธ๋จ ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค.
- 3-2-1-3. ๊ณ์ฐ๋ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์์๋ฅผ ๋งค๊ธด๋ค.- 3-2-2. ์ ์ฌ๋ ์์์์ผ๋ก ์์ 5๊ฐ ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅธ๋ค.
- ๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์จ๋ค.
- ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ํ๋ํ๋ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.
- OpenCV์ compareHist() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง ํ๋ํ๋์ ํ์คํ ๊ทธ๋จ ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค.
- ๊ณ์ฐ๋ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์์๋ฅผ ๋งค๊ธด๋ค.
- ์ ์ฌ๋ ์์์์ผ๋ก ์์ 5๊ฐ ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅธ๋ค.
- ๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์ด๊ฒ์ ๊ฐ์ง๊ณ ๋ค์ ์ฝ๋์ค๋ฝ๊ฒ.
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.
- build_histogram_db()
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ํ๋ํ๋ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.- search()
- OpenCV์ compareHist() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง ํ๋ํ๋์ ํ์คํ ๊ทธ๋จ ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค.
- ๊ณ์ฐ๋ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์์๋ฅผ ๋งค๊ธด๋ค.
- ์ ์ฌ๋ ์์์์ผ๋ก ์์ 5๊ฐ ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅธ๋ค.- ๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์ค๊ณ๋ฅผ ์กฐ๊ธ๋ ๋จ์ํํ๊ธฐ ์ํ ๊ธฐ๋ฅ ์ ํ
-> ๊ฒ์ ๋์์ ์ด๋ฏธ์ง ์ค ํ๋์ ์ด๋ฆ์ ์
๋ ฅ๋ฐ๋ ๊ฒ.
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
build_histogram_db()
- CIFAR-100 ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์จ๋ค.
- CIFAR-100 ์ด๋ฏธ์ง๋ค์ ํ๋ํ๋ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.
- ์ด๋ฏธ์ง ์ด๋ฆ์ ํค๋ก ํ๊ณ , ํ์คํ ๊ทธ๋จ์ ๊ฐ์ผ๋ก ํ๋ ๋์ ๋๋ฆฌ histogram_db๋ฅผ ๋ฐํํ๋ค.CIFAR-100 ํ์คํ ๊ทธ๋จ ์ค ์ ๋ ฅ๋ ์ด๋ฏธ์ง ์ด๋ฆ์ ํด๋นํ๋ ํ์คํ ๊ทธ๋จ์ ์ ๋ ฅ ์ด๋ฏธ์ง๋ก ์ ํํ์ฌ target_histogram์ด๋ผ๋ ๋ณ์๋ช ์ผ๋ก ์ง์ ํ๋ค.
search()
- ์ ๋ ฅ ์ด๋ฏธ์ง ํ์คํ ๊ทธ๋จ target_histogram์ ์ ์ฒด ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค์ ํ์คํ ๊ทธ๋จ์ ๊ฐ์ง ๋์ ๋๋ฆฌ histogram_db๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๋๋ค.
- OpenCV์ compareHist() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๊ฒ์ ๋์ ์ด๋ฏธ์ง ํ๋ํ๋์ ํ์คํ ๊ทธ๋จ ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ๋ result๋ผ๋ ์ด๋ฆ์ ๋์ ๋๋ฆฌ๋ก, ํค๋ ์ด๋ฏธ์ง ์ด๋ฆ, ๊ฐ์ ์ ์ฌ๋๋ก ํ๋ค.
- ๊ณ์ฐ๋ ์ ์ฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์์๋ฅผ ๋งค๊ธด๋ค.
- ์ ์ฌ๋ ์์์์ผ๋ก ์์ 5๊ฐ ์ด๋ฏธ์ง๋ง ๊ณจ๋ผ์ result์ ๋จ๊ธด๋ค.๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.