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

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

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

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

Q&A

解決済

2回答

801閲覧

グレースケール画像の画素値を変更したい

Cre

総合スコア8

Python

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

0グッド

0クリップ

投稿2023/02/14 16:48

実現したいこと

グレースケール画像の画素値を0~20の部分は全部0、21~40の部分は21など、画像の画素値を読み込んだうえで指定の値に変更したい

前提

コラボでpythonを利用し、読み込んだグレースケール画像の画素値を自在に変更したいです。
画像は256×256スケールのものを使用しています。

発生している問題・エラーメッセージ

出力した画像の画素値が変更されていない

該当のソースコード

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
%matplotlib inline
import pywt
import cv2
import numpy as np

img = cv2.imread('woman.bmp',cv2.IMREAD_GRAYSCALE)

d=0
for a in range(256):
for b in range(256):
c = img[a,b]
for e in range(256):
if c == d:
img[a,b]=200
d += 1
cv2.imwrite("Rewoman.bmp",img)

試したこと

初めは、閾値を設けて階調変更しようとしたが、変わってないように思えたので、確認のため以下のソースコードのように、画素値を全面200にしようとしてみたが、出力画像は元画像と変化なく、画素値の変更自体が実現できていないことが発覚した。
for a in range(256):
for b in range(256):
の後に
img[a,b]=100
と書くと出力画像は全面灰色になり、色を変えることはできたが、画素値が0~10の部分の画素値を0、11~20は11など指定の画素値の部分のみ変更するという実現したいことはできていない。

###よろしくお願いします。

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

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

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

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

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

hoshi-takanori

2023/02/14 18:40

「画素値を0~20の部分は全部0」は普通に if 文でできるのでは。 c = img[a, b] if 0 <= c <= 20: img[a, b] = 0 あと、特に python はインデントが失われると意味不明なので、コードの貼り方を見直してもらえると助かります。 https://teratail.com/help/question-tips#questionTips35
Cre

2023/02/14 20:15

なるほど!if分にそんな書き方があるんですね勉強になりました。
Cre

2023/02/14 20:44

hoshi-takanoriさんの書いていただいたif分を利用して実現できました。 ありがとうございます
guest

回答2

0

画素単位で 処理結果の画素値が処理前の画素値のみに基づいて一意に定まる という話なのであれば,
OpenCV を使っているなら LUT という関数が使えるのではないでしょうか.

投稿2023/02/15 01:35

fana

総合スコア11712

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

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

k5kkkkk

2023/02/17 05:39

同じテーブルで複数の画像を変換したい場合は、LUTで実装したほうが実行速度は速いでしょうね。
guest

0

ベストアンサー

python

1import cv2 2import numpy as np 3 4img = cv2.imread('flower.jpg', cv2.IMREAD_GRAYSCALE) 5interval = 20 6bins = np.arange(0, 256, interval) 7img = (np.digitize(img, bins, right=True) - 1) * interval + 1 8img[img==1] = 0 9 10print(np.unique(img)) # [ 0 21 41 61 81 101 121 141 161 181 201 221] 11cv2.imwrite('Reflower.jpg', img)

左側が元画像(flower.jpg)、右側がグレイスケール+量子化(quantize)した画像。
イメージ説明

投稿2023/02/14 17:48

melian

総合スコア19883

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

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

Cre

2023/02/14 20:16

新たなアプローチですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問