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

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

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

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

Q&A

解決済

1回答

1050閲覧

画素の総数が知りたい

tiroha

総合スコア109

Python

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

0グッド

0クリップ

投稿2022/01/07 10:16

以下のプログラムで2枚の画像を比較して、一致しない画素値の総数を出力します。
画像のサイズは両方とも256×256です。
なので、画素値の総数は256*256=65,536ですよね?
しかし、プログラムを実行すると、この値を超える数字が出てきます。
これはどこがおかしいのでしょうか?それとも正しいですか?

python

1import cv2 2import numpy as np 3 4# 画像を比較し、一致していない箇所を表示する 5 6# 元画像 7# 単一画像 8img_original = cv2.imread("test3_2D/00109_OUT.png") 9 10#マルチスケール画像 11#r, img_original = cv2.imreadmulti('a.tif', [], cv2.IMREAD_ANYCOLOR) 12 13# 比較対象画像(単一画像) 14img_comparison1 = cv2.imread("MVI354/Target/00109.png") 15#マルチスケール画像 16#r, img_comparison1 = cv2.imreadmulti('a.tif', [], cv2.IMREAD_ANYCOLOR) 17 18# 比較対象画像2枚目(違う画像) 19#r, img_comparison2 = cv2.imreadmulti('b.tif', [], cv2.IMREAD_ANYCOLOR) 20 21#比較画像の画素値が一致しない総数を出力 22print(sum(np.sum(img_original[i] != img_comparison1[i]) for i in range(len(img_comparison1)))) 23#print(sum(np.sum(img_original[i] != img_comparison2[i]) for i in range(len(img_comparison2)))) 24

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

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

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

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

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

y_waiwai

2022/01/07 10:24

どういう数字が出てくるんでしょうか
coco_bauer

2022/01/07 10:33

「画素値」というのは、どういう意味で使っていますか? 256*256の画素で構成される画像というのであれば判ります。 また、各画素の色(RGB値)というのであれば、判ります。 「画素値」というのは、一般的に使われる用語なのですか?
melian

2022/01/07 10:39

対象の画像はカラーで、RGB 単位で比較をしているのだと思います(最大で3倍)。
tiroha

2022/01/07 11:02

具体的な数値は70,000~80,000です。 画素値は一般的な意味のピクセルと同義として扱っています。 そうなんですね。比較する2枚の画像は白黒なのですが、それでもRGB単位で処理されますか? もし白黒画像用に修正するとしたら、どこを修正すれば良いですかね?
melian

2022/01/07 11:13

白黒なのですね。それでは print(img_original.shape) と print(img_comparison1.shape) の結果を教えてもらえますか?
tiroha

2022/01/07 11:44

(256, 256, 3) (256, 256, 3) と出力されました。
melian

2022/01/07 12:55

ありがとうございます。では print((img_original != img_comparison1).any(axis=-1).sum()) の結果はどうなりますでしょうか。
tiroha

2022/01/07 13:20

16007 と出てきます
melian

2022/01/07 13:26

はい、それが「一致しない画素値の総数」になります。
tiroha

2022/01/07 13:52

?! ありがとうございます! 僕のプログラムとは何が違うのですか?
tiroha

2022/01/07 14:04

白黒専用ですか?
melian

2022/01/07 14:27

tiroha さんのはすべての要素(256*256*3=196608個)を比較しています。グレースケールとのことですが、カラーチャネルが使われているので画素数よりも大きくなってしまう事があるわけです。わたしのはany(axis=-1) を付ける事で3個のカラーチャネル全体で比較をしています。
tiroha

2022/01/07 14:49

3個のカラーチャネル全体で比較とはどういうことでしょうか? 256*256のみを比較ということですか?
melian

2022/01/07 15:01

はい、その通りです。くどくどとした説明はお嫌いでしょうが、any() は配列内に一つでも True が あれば True を返し、全て False であれば False を返します。この場合では、どれか一つでもカラーチャネルの値が異なっていれば True を、全て同じであれば False になります。 np.array([ True, False, False]).any() => True np.array([ True, True, False]).any() => True np.array([False, False, False]).any() => False .any(axis=-1) を実行すると、256 * 256 の boolean の配列ができる事になります。そして .sum() で最終的な結果を得ることになります。
tiitoi

2022/01/08 01:47

cv2.imread() は第2引数に cv2.IMREAD_GRAYSCALE を指定しないと、元の画像がグレースケールでも RGB として読み込まれます。
tiroha

2022/01/08 01:54

そうなんですね。 ありがとうございます。
guest

回答1

0

自己解決

cv2.imread()に第2引数を付ける。
例えば、
img_original = cv2.imread("test3_2D/00109_OUT.png",0)
もしくは
img_original = cv2.imread("test3_2D/00109_OUT.png",cv2.IMREAD_GRAYSCALE)
とする。

投稿2022/01/08 01:55

tiroha

総合スコア109

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問