困っていること
opencvで読み込んだ画像を修正し、修正した画像を表示すると元画像よりも画質が荒くなってしまいます。
実現したい事
差分比較で2つの画像を比較し、差がないところはそのまま、差があるところは赤色に変更し表示をさせようとしています。
流れは以下の通りです。
1. tkinterでファイル選択ダイアログを表示
2. 2つの画像を選択(jpg形式)
3. 2つの画像情報を取得
4. 変化なしの部分を検出
5. 変化ありの部分を検出し赤色に変換
6. 変化点のみ赤色にした画像を表示
コードは以下の通りです。
# -*- coding: utf-8 -*- """ """ import os,sys from tkinter import * from tkinter import ttk from tkinter import filedialog from tkinter import messagebox import cv2 import numpy as np import time # **----- クリックイベント -----** # 参照ボタン クリック時の処理 def first_button_clicked(): fTyp = [("","*")] iDir = os.path.abspath(os.path.dirname(__file__)) filepath = filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir) first_flabel.set(filepath) def second_button_clicked(): fTyp = [("","*")] iDir = os.path.abspath(os.path.dirname(__file__)) filepath = filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir) second_flabel.set(filepath) # スタートボタン クリック時の処理 def start_button_clicked(): # **----- 1つ目のファイル -----** # ファイル名の取得 drwfile = os.path.basename(first_flabel.get()) drwpath = os.path.abspath(first_flabel.get()) # 画像情報の取得 first_drw_img = imread(drwpath, 1) first_height = first_drw_img.shape[0] first_width = first_drw_img.shape[1] # **----- 2つ目のファイル -----** # ファイル名の取得 drwfile = os.path.basename(second_flabel.get()) drwpath = os.path.abspath(second_flabel.get()) # 画像情報の取得 second_drw_img = imread(drwpath, 1) second_height = second_drw_img.shape[0] second_width = second_drw_img.shape[1] root.destroy() comparison_img(first_drw_img, second_drw_img) def comparison_img(first_drw_img, second_drw_img): red = [0, 0, 255] # 黒背景の行列作成 zeros_img = np.zeros(first_drw_img.shape) # 一致している部分を白色に変換して抽出 comparison = np.where(first_drw_img == second_drw_img, 1, 0) # 等しければ 1、差があれば 0の配列を生成 difference_img1 = np.array(first_drw_img * comparison, dtype = np.uint8) # 異なっている部分を赤色に変換して抽出 comparison2 = np.where(first_drw_img != second_drw_img, red, 0) difference_img2 = np.array(zeros_img + comparison2, dtype = np.uint8) # 相違点のみ抽出 final_img = np.array(difference_img1 + difference_img2, dtype = np.uint8) cv2.namedWindow('final_img', cv2.WINDOW_KEEPRATIO | cv2.WINDOW_NORMAL) cv2.imshow('final_img', final_img) cv2.waitKey(0) cv2.destroyAllWindows() # 日本語pathでも読み込み可能にする def imread(drwfile, flags=cv2.IMREAD_COLOR, dtype=np.uint8): try: n = np.fromfile(drwfile, dtype) drw_img = cv2.imdecode(n, flags) return drw_img except Exception as e: return None #============================================================ # ファイル選択フォーム作成 #============================================================ if __name__ == '__main__': # rootの作成 root = Tk() root.title('ファイル選択') root.resizable(False, False) # Frame1の作成 frame1 = ttk.Frame(root, padding=10) frame1.grid() # Frame2の作成 frame2 = ttk.Frame(root, padding=(0,5)) frame2.grid(row=1) # **----- ボタンの作成 -----** # 1つ目の参照ボタンの作成 first_button = ttk.Button(frame1, text=u'参照', command=first_button_clicked) first_button.grid(row=0, column=3, padx=2) # 2つ目の参照ボタンの作成 second_button = ttk.Button(frame1, text=u'参照', command=second_button_clicked) second_button.grid(row=1, column=3, padx=2) # Startボタンの作成 start_button = ttk.Button(frame2, text='Start', command=start_button_clicked) start_button.pack(side=LEFT) # Cancelボタンの作成 cancel_button = ttk.Button(frame2, text='Cancel', command=root.destroy) cancel_button.pack(side=LEFT) # **----- ラベルの作成 -----** # 1つ目の「ファイル」ラベルの作成 s = StringVar() s.set('ファイル>>') fisrt_label = ttk.Label(frame1, textvariable=s) fisrt_label.grid(row=0, column=0, pady=5) # 2つ目の「ファイル」ラベルの作成 second_label = ttk.Label(frame1, textvariable=s) second_label.grid(row=1, column=0, pady=5) # 1つ目の参照ファイルパス表示ラベルの作成 first_flabel = StringVar() file1_entry = ttk.Entry(frame1, textvariable=first_flabel, width=50) file1_entry.grid(row=0, column=2, pady=5) # 2つ目の参照ファイルパス表示ラベルの作成 second_flabel = StringVar() file1_entry = ttk.Entry(frame1, textvariable=second_flabel, width=50) file1_entry.grid(row=1, column=2, pady=5) root.mainloop()
cv2.namedwindowがないと画質は変わりませんが、全画面での表示ができません。
画像サイズは13244 x 9354 です。
試したこと
・画像を最初に読み込んだ際と、修正後に表示する前にshapeで確認したらどちらも[13244, 9354, 3]でした。
なのでサイズは変わってないことは確認してます。
・画像をプロパティで確認すると解像度が400 dpiでした。ネットで調べてみたらPCのデフォルトの解像度が96 pdiとの記載があったので、そこが原因では?と
考えていますが、確認方法、変更方法がわかりません。
推測が的外れかもしれませんが御教授下さい。また素人、独学でやっている為、ここの書き方変えた方がいい、汚い書き方など指摘ありましたら言って頂けたら幸いです。
環境はpython3.7です。該当の写真は都合上、お見せすることができません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。