แ ๐ต [15 ์ผ์ฐจ] : FUNDAMENTAL 16. ์ด๋ฏธ์งํ์ผ ๋ค๋ฃจ๊ธฐ
๋ฏธ๋ฆฌ ์์๋ณด๊ธฐ
- pillow
- OpenCV
- ์ด๋ฏธ์ง ์ด๊ธฐ, ํ์ผ ์ ๋ณด ์ถ์ถํ๊ธฐ
- CIFAR-100์์ ํ์คํ ๊ทธ๋จ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฌํ ์ด๋ฏธ์ง๋ฅผ ๊ณจ๋ผ๋ด๊ธฐ
ํ๊ฒฝ ์ธํ
-
ํฐ๋ฏธ๋์์ ์๋์ ๊ฐ์ด ์ธํ
$ 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
๋์งํธ ์ด๋ฏธ์ง
- ๋์งํธ ํ๋ฉด์ ์๋ง์ ์ ๋ค๋ก ์ด๋ฃจ์ด์ง
- ์์์ ๊ฐ์ง๋ ์ ํ๋๋ฅผ ํ์(pixel, picture element)
- ๊ฐ ํ์๋ RGB(Red, Green, Blue) ์ธ ๊ฐ์ ๋จ์ผ ์์ ๊ฐ๋๋ฅผ ๊ฐ๊ฐ ์กฐ์ ํ์ฌ ์์์ ํํ
-> ์ด์
๋์ ๋ง๋ง์ ์๋ ์์ธํฌ๊ฐ ์ธ๊ฐ์ ๊ฒฝ์ฐ ๋๋ถ๋ถ ์ธ ๊ฐ์ง๋ก
๋์คํฐ or ๋นํธ๋งต
ํฐ๋ฏธ๋์์ ์๋์ ๊ฐ์ด ์ธํ
$ 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
-> ์ด์
๋์ ๋ง๋ง์ ์๋ ์์ธํฌ๊ฐ ์ธ๊ฐ์ ๊ฒฝ์ฐ ๋๋ถ๋ถ ์ธ ๊ฐ์ง๋ก
- ๋นจ๊ฐ, ์ด๋ก, ํ๋ ์ธ ๊ฐ์ง ์์ ๊ฐ๋๋ก ํํ๋๋ ์ ํ๋ํ๋์ ์์ ๊ฐ์ ์ ์ฅ
- ์ด๋ฅผ ๋์คํฐ(raster) ๋๋ ๋นํธ๋งต(bitmap) ๋ฐฉ์์ ์ด๋ฏธ์ง
- ํ ์ ๋ง๋ค ๊ฐ ์์๋ณ๋ก 8๋นํธ๋ฅผ ์ฌ์ฉํ์ฌ 0~255 ์ฌ์ด์ ๊ฐ(2^8 = 256)์ผ๋ก ํด๋น ์์ ๊ฐ๋๋ฅผ ํ์
๋ฒกํฐ
- ๋ฒกํฐ(vector) ๋ฐฉ์์ ์ด๋ฏธ์ง๋ ์๋์ ์ธ ์ ๊ณผ ์ ์ ์์น๋ฅผ ๋ฐฉ์ ์์ผ๋ก์จ ๊ธฐ๋ก
- ํ๋ ๋ฐ ์ถ์์ ๋ฐ๋ผ ๋์งํธ ํ๋ฉด์ ๊ฐ ํ์์ ์ด๋ป๊ฒ ํํ๋ ์ง๋ฅผ ์ฌ๊ณ์ฐํ๊ธฐ์ ๊นจ์ง์ด ์์
jpg
- ๊ทผ์ฒ์ ์๋ ํ์๋ค์ ๋ฌถ์ด, ๋น์ทํ ์๋ค์ ๋ญ๋ฑ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ถ
- ์์ ์ ๋ณด์ ์์ค, ์ ์ฅํ ๋ ์์ถ๋ฅ ์ ๋์ผ ๋
- ๋ค์ ์ ์ฅํ๋ ๋ฑ ์ฌ์์ถ ์
- ๋์งํธ ํํ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์์ด ์ง์ ๋ถํด์ง๋ ํ์
png
- ์คํฌ๋ฆฐ์ท ๋ฑ์ ๋ง์ด ์ฌ์ฉ๋๋ PNG ์ด๋ฏธ์ง ํ์
- ์์์ ์์ค ์์ด ์ด๋ฏธ์ง๋ฅผ ์์ถ
- ์ด๋ฏธ์ง์ ์ฌ์ฉ๋ ์์์ ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ๊ทธ๋ฅผ ์ฐธ์กฐํ๋ ํ๋ ํธ ๋ฐฉ์์ ์ฌ์ฉ
- ์ฌ์ฉ๋ ์์์ด ์ ์ ๋จ์ํ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋์ผํ ํด์๋์ JPEG ํ์ผ๋ณด๋ค๋ ์ฉ๋์ด ์์
- ์ฌ์ง๊ณผ ๊ฐ์ด ์ด๋ฏธ์ง์ ์ฌ์ฉ๋ ์์์ด ๋ง์์ง๋ฉด JPEG ํ์ผ๋ณด๋ค ์ฝ๊ฒ ๋ ๋ง์ ์ฉ๋์ ์ฐจ์ง
GIF
- ์์งค๋ก ์ต์
- ์ด๋ฏธ์ง ๋ด์ ์ฌ๋ฌ ํ๋ ์์ ๋์ด ์ด๋ฅผ ์์ง์ด๊ฒ
- ์์ ์ ๋ณด๋ฅผ ์์ค ์์ด ์ ์ฅ
- 256๊ฐ์ ์์๋ง ๊ธฐ์ตํ ์ ์๋ ํ๋ ํธ ๋ฐฉ์์ผ๋ก ์ ํ
์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ (Pillow ์ฌ์ฉ๋ฒ)
- ์ ์
- PIL(Python Image Library)์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ- Pillow๊ฐ ์ด์ด๋ฐ์ ํ์ฌ๊น์ง๋ ์ง์์ ์ผ๋ก ์ฌ์ฉ
- Pillow๋ Numpy์ ๊ฒฐํฉํ์ฌ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ
- ๋์งํธ ์ด๋ฏธ์ง
- ์ด๋ฏธ์ง๋ ๋ฐฐ์ด ํํ์ ๋ฐ์ดํฐ- ์
- ๊ฐ๋ก ์ธ๋ก ๊ฐ 32ํฝ์
์ RGB ์ธ ๊ฐ์ง ์์ ์ฑ๋
- Numpy๋ก [32, 32, 3] ์ฐจ์์ ๋ฐฐ์ด์ ์์ฑ
- ๋ฐ์ดํฐ ํ์ ์ uint8(๊ฐ ๊ฐ์ด ๋ถํธ๊ฐ ์๋(unsigned) 8๋นํธ ์ ์(integer))
- 0~255(2์ 8์น = 256) ์ฌ์ด์ ๊ฐ
data = np.zeros([32,32,3],dtype=np.unit8)
=> ๋ฐ์ดํฐ๋ ๋ํ์ด ์ ๋ก์ 32,32,์ธ์ด์ฆ์ 3์์์ dtype์ด ๋ํ์ด
- ๊ฐ๋ก ์ธ๋ก ๊ฐ 32ํฝ์
์ RGB ์ธ ๊ฐ์ง ์์ ์ฑ๋
- ์
numpy PIL ํธ์ถ
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
์
- width์ height๋ฅผ ์ถ๋ ฅํ๊ณ , .save()๋ฅผ ์ด์ฉํ์ฌ jpg ํ์ผ ํฌ๋งท์ผ๋ก ์ ์ฅ
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)
์ด๋ฏธ์ง ์ ์ฅ .save()
resized_image = img.resize((100,200))
์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ .resize()
resized_image = img.resize((100,200))
์ด๋ฏธ์ง ์๋ผ๋ด๊ธฐ .crop()
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
Pillow๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
CIFAR ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ฐ๋ณ ์ด๋ฏธ์ง ํ์ผ๋ก ์ถ์ถ
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)
๋ชจ๋ pickle ํ์ฉ๋ฒ
- pickle.dump(๊ฐ์ฒด, ํ์ผ) ๋ก ์ ์ฅํ๊ณ
- pickle.load(ํ์ผ) ๋ก ๋ก๋ฉํฉ๋๋ค
- ํ์ด์ฌ์ ๋ณ์ ํน์ ํด๋์ค ์ธ์คํด์ค๋ฅผ binary ํํ๋ก ์ ์ฅํ๋ ํจํค์ง
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ํ๋ฉด ์ด๋ฏธ์ง ํ์ผ ์๋ณธ์ด ๋ณต๊ตฌ๋จ
- ์ฃผ์์
- 3072๋ฐ์ดํธ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ์ 1024๋ฐ์ดํธ๋ ๋นจ๊ฐ(R), ๊ทธ๋ค์ 1024๋ ๋ น์(G), ๋ง์ง๋ง 1024๋ ํ๋(B)- ๊ทธ๋ฅ ๋ชจ์๋ง ๋ง์ถ์ด reshapeํ๋ฉด ์๋จ
- 1024๋ฅผ 32X32์ ์ฑ์ฐ๋ ๊ฒ์ 3๋ฒ ๋ฐ๋ณตํ๋ ๋ฐฉ์์ reshape
- ์์ ์ฐจ์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ฐ๋ ๋ฐฉ์์ reshape๋ฅผ ์ํด np.reshape์๋ order๋ผ๋ ์ธ์
- ์ด ์ธ์๋ฅผ Fํธ ์ฃผ๋ฉด ์ํ๋ ํํ๋ก ์งํ
image_data = train[b'data'][0].reshape([32, 32, 3], order='F') # order๋ฅผ ์ฃผ์ํ์ธ์!!
image = Image.fromarray(image_data) # Pillow๋ฅผ ์ฌ์ฉํ์ฌ Numpy ๋ฐฐ์ด์ Image๊ฐ์ฒด๋ก ๋ง๋ค์ด์
image # ํ๋ฉด์ ๋์ ๋ด
์๋ค!!
x์ถ๊ณผ y์ถ์ด ๋ค์ง์ด์ ๋์ด -> ์ถ์ ๋ฐ๊ฟ์ฃผ๋ ์์ ์ด ํ์
์ด๋ฏธ์ง ์ถ ๋ฐ๊พธ๊ธฐ
- np.swapaxes(0, 1)
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]
OpenCV
- ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ตฌํ
Changing Colorspaces - OpenCV์์๋ RGB๊ฐ ์๋ BGR์์
์ฝ๋๋ฅผ ํ๋ฒ ์ดํด๋ณด์ธ์.
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)
Convert BGR to HSV
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
define range of blue color in HSV
lower_blue = np.array([100,100,100])
upper_blue = np.array([130,255,255])
Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
Bitwise-AND mask and original image
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://media.vlpt.us/images/pasianus/post/c6fbdf3d-ff34-495e-af1d-e1da89627f03/%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๋ ์ธ๋
.imrea()
img_path = './python_image_proc/data/cv_practice.png'
img = cv.imread(img_path)
ํ์ผ๋ก๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ์ฝ์ด์ ๋ฐํํด์ฃผ๋ ํจ์
OpenCV ๊ณต์ ๋ฌธ์ํ ์ฌ์ดํธ
.cvtColor(๋ณ์, cv.COLOR_BGR2HSV)
# 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 ์ด๋ฏธ์ง๋ก ๋ณํํ๋ค.
- ์์์ ๋ฒ์์ ๋ฐ๋ผ ํน์ ์์์ ๊ฐ์ฒด๋ฅผ ์ถ์ถํ๋ ๋ง์คํฌ๋ฅผ ์์ฑํ๋ค.
- ์์ฑํ ๋ง์คํฌ์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ๊ณ์ฐํ์ฌ ํน์ ํ ์์์ ๊ฐ์ฒด๋ง ์ถ์ถ๋๋ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค.
์ถ์ถํ ๊ธฐ์ค์์ผ๋ก ๋ง์คํฌ ์์ฑ .inRange()
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
- img ๋ฅผ ๋ณํํ hsv์๋ค๊ฐ ์ด ๊ธฐ์ค๋ค(lower_blue, upper_blue)๋ฅผ ์ ์ฉ
- ํด๋นํ๋ ํฝ์ ๋ค์๋ 1, ๊ทธ๋ ์ง ์์ ํฝ์ ๋ค์๋ 0์ ์ฐ์ด๋์ ๋ฐฐ์ด์ ๋ฐํ
๊ฐ๋ก 400, ์ธ๋ก 300 ํฝ์ ์ง๋ฆฌ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์๋ค๋ฉด, img๊ณผ hsv๋ ๊ฐ๊ฐ ํฝ์ ๋น BGR, HSV ์ธ ๊ฐ์ ์์ ์ฑ๋๋ณ ๊ฐ์ ๊ฐ์ง ํ ๊ธฐ ๋๋ฌธ์, 400 300 3์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ด์๊ณ , mask๋ ํฝ์ ๋ง๋ค 1 ๋๋ 0๋ง์ ๊ฐ์ผ๋ก ๊ฐ์ก๊ธฐ์ 400 300 ( 1)์ ํฌ๊ธฐ
์ผ์ชฝ์ด original frame์ผ๋ก mask๋ฅผ ๋ง๋ ๋ค 1์ ํฐ์์ผ๋ก, 0์ ๊ฒ์ ์ผ๋ก ํ์ํ๋ค๋ฉด, ์ ์ด๋ฏธ์ง์ ๊ฐ์ด๋ฐ์ ์๋ mask image์ ๋์ผ
.bitwise_and() ์ด๋ฏธ์ง ๋์ฅ์ AND ์ฐ์ฐ
์ด๋ฏธ์ง ๋ ์ฅ์ ๋ฐ์์ AND ๋นํธ ์ฐ์ฐ์ ํ๋ค๋ ๊ฑด๋ฐ, ์ฐ๋ฆฌ๋ ์ด ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒ ์๋๋ ๋ ์ฅ ๋ค ๊ฐ์ ์ด๋ฏธ์ง(img, img)๋ฅผ ๋ฃ์ด์ ๊ฒฐ๊ตญ ๋์ผํ ์ด๋ฏธ์ง๊ฐ ๋์ค๊ฒ ํฉ๋๋ค. ๋์ ์ค์ํ mask๋ฅผ ๊ฐ์ด ๋ฃ์ด์ค์, ํด๋น ์์ญ๋ง ๋ฐ์ค๋๋ก ํฉ๋๋ค. ๋ฐ์จ ์์ญ์ ์ ๊ณต์ ๋ฌธ์ ํ์ด์ง์ ํจ์ ์ค๋ช ์ ๋ฐ๋ผ dst๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ๊ทธ ์์, ์๋๋ฉด ์๋ก ๋น ๊ฒ์ ์ ์์ญ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐํ
์ด๋ฏธ์ง ๊ฐ์ฒด์ ์ปฌ๋ฌ๋ณํ cvtColor(๋ณ์, cv.COLOR_BGR2RGB)
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 ๋ก ์ด๋ฏธ์ง๋ฅผ ๋์ฐ๋ ๋ฐฉ๋ฒ
- cv.imshow(res) = PIL.Image.show(), plt.imshow()
๋น์ทํ ์ด๋ฏธ์ง ์ฐพ์๋ด๊ธฐ
์ด๋ฏธ์ง์์ ์์ ํ์คํ ๊ทธ๋จ์ ์ถ์ถ
ํ์คํ ๊ทธ๋จ
- ์ด๋ฏธ์ง์์ ํฝ์ ๋ณ ์์ ๊ฐ์ ๋ถํฌ
- ํ์คํ ๊ทธ๋จ์ ํตํด, ๊ฐ ์ด๋ฏธ์ง์ ์์ ๋ถํฌ๋ฅผ ๋น๊ตํ์ฌ ์๋ก ์ ์ฌํ ์ด๋ฏธ์ง๋ฅผ ํ๋จํ๋ ์ฒ๋๋ก ์ฌ์ฉ
์์ ์์๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ฐฑ์ผ๋ก ๋ณํํ์ ๋ ๋ฐ๊ธฐ์ ๋ฐ๋ฅธ ํ์คํ ๊ทธ๋จ
์ฐ๋ฆฌ๋ 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')
์๋ก ๋น๊ตํ๋ ๊ธฐ๋ฅ
์ค๊ณ ์ค์ต
STEP1. ์์ด๋์ด ๊ฐ์
์ฐ๋ฆฌ๊ฐ ๋ง๋ค ๊ฒฐ๊ณผ๋ฌผ์ histogram_search.py๋ผ๋ Python ํ์ผ์ด๊ณ , ์ด ํ์ผ์ ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก ํ๋๋ฅผ ๋ช
๋ น์ค์์ ์
๋ ฅ์ผ๋ก ๋ฐ์, ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋น์ทํ ์ด๋ฏธ์ง๋ค์ ๊ณจ๋ผ ํ๋ฉด์ ํ์ํ๋ ๊ธฐ๋ฅ์ ์ํ
์ฐ๋ฆฌ๊ฐ ๋ง๋ค ๊ฒฐ๊ณผ๋ฌผ์ histogram_search.py๋ผ๋ Python ํ์ผ์ด๊ณ , ์ด ํ์ผ์ ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก ํ๋๋ฅผ ๋ช ๋ น์ค์์ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋น์ทํ ์ด๋ฏธ์ง๋ค์ ๊ณจ๋ผ ํ๋ฉด์ ํ์ํ๋ ๊ธฐ๋ฅ์ ์ํ
ํต์ฌ์
1. ์ปดํจํฐ์๊ฒ ๋น์ทํ ์ด๋ฏธ์ง๋ผ๋ ๊ฐ๋
์ ์ด๋ป๊ฒ ๊ตฌํํ๋๋
- ํ์คํ ๊ทธ๋จ์ผ๋ก ๋น๊ต
-> OpenCV์์ cv2.compareHist() ๋ผ๋ ํจ์ ์ ๊ณต
- ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ช ๋ น์ค์์ ์ ๋ ฅ์ผ๋ก ๋ฐ๋ ๊ฒ์ ์ด๋ป๊ฒ ํ์ง?
- sys.argv๋ฅผ ์ฌ์ฉ
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ ์ด๋์ ๊ฐ์ ธ์ค์ง?
- CIFAR-100 ์ด๋ฏธ์ง ์ฌ์ฉ
์๋ ์์ ์ ๋ฆฌ
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋ถ๋ฌ์จ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋น์ทํ ์ด๋ฏธ์ง 5๊ฐ๋ฅผ ํ์ํ๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์์ด๋์ด ๊ตฌ์ฒดํ
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค.
- ์ ๋ ฅ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- ๊ฒ์ ๋์ ์ด๋ฏธ์ง๋ค ์ค ๋ถ๋ฌ์จ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋น์ทํ ์ด๋ฏธ์ง 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 ์ด๋ฏธ์ง๋ค์ ํ๋ํ๋ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ง๋ ๋ค.
- CIFAR-100 ํ์คํ ๊ทธ๋จ ์ค ์ ๋ ฅ๋ ์ด๋ฏธ์ง ์ด๋ฆ์ ํด๋นํ๋ ํ์คํ ๊ทธ๋จ์ ์ ๋ ฅ ์ด๋ฏธ์ง๋ก ์ ํํ๋ค. - 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์ ๋จ๊ธด๋ค.๊ณ ๋ฅธ ์ด๋ฏธ์ง๋ค์ ํ์ํ๋ค.
ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
์ฝ๋๋ก ๊ตฌํ
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(แ ๐ต [15 ์ผ์ฐจ] : FUNDAMENTAL 16. ์ด๋ฏธ์งํ์ผ ๋ค๋ฃจ๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@pasianus/AIFFEL-Week04-FU16-์ด๋ฏธ์งํ์ผ-๋ค๋ฃจ๊ธฐ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค