画像ファイルopencvの処理
Opencvパッケージを使用して画像ファイルを処理しましょう。
画像ファイルがRGB順に格納されている場合、opencvはBGR!
import os
import pickle
from PIL import Image
import os
import pickle
import cv2
import numpy as np
from matplotlib import pyplot as plt
from tqdm import tqdm
dir_path = 'C:/study/cifar-100-python'
train_file_path = os.path.join(dir_path, 'train')
with open(train_file_path, 'rb') as f:
train = pickle.load(f, encoding='bytes')
images_dir_path= 'C:/study/cifar-images'
filename = train[b'filenames'][0].decode()
ヒストグラムを保存し,呼び出した画像を4つの部分に分割する.リストとして保存し、リストをマトリクスにマージします.マージの原因は、1つのマトリクスで値を処理するためであり、例を挙げてみましょう.def get_histogram(image):
histogram = []
# 색삭은 총 3가지이기 때문에 3번 반복합니다.
for i in range(3):
#calcHist는 히스토그램을 만들어주는 함수 입니다.
channel_histogram = cv2.calcHist(images=[image],
channels=[i],
mask=None,
histSize=[4], # 히스토그램을 4개의 구간으로 나눕니다
ranges=[0, 256])
histogram.append(channel_histogram) #list에 저장을 합니다.
#list에 저장된 행렬을 결합해줍니다,
histogram = np.concatenate(histogram)
# 정규화를 시켜줍니다.
histogram = cv2.normalize(histogram, histogram)
return histogram
import cv2
#위에 만든 함수가 잘 작동하는지 보겠습니다.
file_path = os.path.join(images_dir_path, filename)
image = cv2.imread(file_path)
histogram = get_histogram(image)
histogram
array([[0.3126804 ],[0.4080744 ],
[0.14521089],
[0.21940625],
[0.18654831],
[0.23742512],
[0.30208108],
[0.35931748],
[0.06465594],
[0.35825753],
[0.36991683],
[0.29254165]], dtype=float32)
12行が表示されました.12行が現れるのは、ヒストグラムを4つの部分に分け、色を3つの部分に分けたため、3×4、計12行が現れるからです.
上では、ヒストグラムの値として保存する関数を作成しました.次に、フォルダ内のすべての画像を名前のヒストグラム値として保存するディックシリーズを作成します.
def build_histogram_db():
histogram_db = {}
#폴더에 있는 모든 파일 이름을 호출
path = images_dir_path
file_list = os.listdir(images_dir_path)
#호출된 이름 하나하나 딕셔너리 키와 값으로 저장
for file_name in tqdm(file_list):
file_path = os.path.join(images_dir_path, file_name)
image = cv2.imread(file_path)
histogram = get_histogram(image)
histogram_db[file_name] = histogram
return histogram_db
ここまでに作成した関数を実験してみましょうか?histogram_db = build_histogram_db()
histogram_db['adriatic_s_001807.png']
array([[0. ],[0. ],
[0.29744893],
[0.5828624 ],
[0. ],
[0.17107612],
[0.41608465],
[0.29315054],
[0. ],
[0.34301192],
[0.37224102],
[0.16505837]], dtype=float32)
次に、目的の画像を入力して呼び出す関数を作成します.
def get_target_histogram():
filename = input("이미지 파일명을 입력하세요: ")
if filename not in histogram_db:
print('유효하지 않은 이미지 파일명입니다.')
return None
return histogram_db[filename]
target_histogram = get_target_histogram()
画像ファイル名:adriatics 001807を入力します.png必要な画像を入力すると値が得られます!
これまでに作成した関数をすべて加算しましょう!履歴値を12行に保存する関数、ディック・シーケンスに名前の値を格納する関数、および必要なファイル名を入力するときに値を呼び出す関数です.
def search(histogram_db, target_histogram, top_k=5):
results = {}
# Calculate similarity distance by comparing histograms.
for file_name, histogram in tqdm(histogram_db.items()):
distance = cv2.compareHist(H1=target_histogram,
H2=histogram,
method=cv2.HISTCMP_CHISQR)
results[file_name] = distance
results = dict(sorted(results.items(), key=lambda item: item[1])[:top_k])
return results
#확인해 보아욥
result = search(histogram_db, target_histogram)
result
{'adriatic_s_001807.png': 0.0,'baby_s_001654.png': 0.047506706444185816,
'fogbank_s_000423.png': 0.059270738493642845,
'tank_s_000442.png': 0.060966690827361725,
'dessert_plate_s_000124.png': 0.06113711905561663}
#이제 우리는 비슷한 히스토리 값을 가진 이미지를 불러왔습니다.
#밖으로 호출을 해봅시다!
def show_result(result):
f=plt.figure(figsize=(10,3))
for idx, filename in enumerate(result.keys()):
img_path = os.path.join(images_dir_path, filename)
im = f.add_subplot(1,len(result),idx+1)
img = Image.open(img_path)
im.imshow(img)
show_result(result)
長い旅の中でopencvを利用して1つの画像を選択すると、ヒストグラムの特性を利用して、必要に応じて複数の似たような画像を呼び出すことができます!!パチパチ
Reference
この問題について(画像ファイルopencvの処理), 我々は、より多くの情報をここで見つけました https://velog.io/@hwanython/이미지파일다루기-opencvテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol