画像ファイルopencvの処理


Opencvパッケージを使用して画像ファイルを処理しましょう。

  • 画像はマトリクス形式
  • に非常に類似している.
    画像ファイルがRGB順に格納されている場合、opencvはBGR!
  • PSを行うとき、一部の部分をマークして編集します.Pythonと同様に、HSV(「色」、「彩度」、「輝度」)を変更することで行うことができます.
  • 多くのcifar画像を読み込み比較します.どのように比較しますか?画像をヒストグラムの値に変換し、cv内部関数を使用して類似画像を検索し、最も類似した画像から順番に並べ替えて、任意の数の類似画像を呼び出す関数を作成します.
    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つのマトリクスで値を処理するためであり、例を挙げてみましょう.
  • [1,2]および[3,4]は、個別に格納された部分を[1,2]および[3,4]に統合するものである.
  • 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つの画像を選択すると、ヒストグラムの特性を利用して、必要に応じて複数の似たような画像を呼び出すことができます!!パチパチ