質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2233閲覧

pythonで表示した画像の解像度を変更する方法

machaco

総合スコア13

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/16 07:35

困っていること

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です。該当の写真は都合上、お見せすることができません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

全画面表示での粗さの改善はできませんでしたが、画像を拡縮できるようにして拡大したら見れるレベルになりました。

投稿2020/01/20 00:35

machaco

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問