@j0083

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonで階調を細分化したい

階調処理がしたい

グレースケール画像のある画素値の範囲を256諧調に細分化することは可能でしょうか?

0 likes

3Answer

画素値がmin_valueからmax_valueまでの値であれば256階調にできる物を作ってみました.

import numpy as np

min_value = 10
max_value = 100

def gradation(x, x_min, x_max, level = 256):
    ret = np.clip(x, x_min, x_max)
    ret = (ret - x_min) / (x_max - x_min)
    return np.ceil(ret * (level - 1))

x = [10, 15, 20, 30, 55, 100]
print(gradation(x, min_value, max_value))
出力
[  0.  15.  29.  57. 128. 255.]

扱うデータxがこの画素値の範囲を超えないのであれば最初のnp.clip()の手続きは不要です.念のために入れたまでですが参考になれば幸いです.

ちなみにmatplotlibなどの画像表示をしてくれるライブラリではこのような書き方をしなくても画像表示の際にデータを自動で諧調処理してくれたのちに表示してくれます.

2Like

Comments

  1. @j0083

    Questioner

    返答ありがとうございます!!!まさに知りたかったプログラムです!!!
  2. 質問がクローズになった後で申し訳ないのですが,どうやら
    切り上げnp.ceil()
    よりも
    四捨五入np.round()
    の方が良さそうですので,訂正の連絡までにこちらも参考になれば幸いです.

Comments

  1. @j0083

    Questioner

    返答ありがとうございます。説明不足で申し訳ございません。グレースケール処理をした画像をさらにある範囲を256階調に細分化したいと思っています.

グレイスケール処理をした画像を256階調の範囲で2値化処理したいのでしょうか?

cv2.threshold(gray,0,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)の第3引数を変えると処理ができます。

test.py
import cv2

def main():
    image=cv2.imread("xxxx.png")
    
    #gray=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
    ret,thresh = cv2.threshold(image,0,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    cv2.imshow("gray1",thresh)

    cv2.waitKey()
    cv2.destroyAllWindows()
if __name__=="__main__":
    main()

0Like

Your answer might help someone💌