210063x
@210063x (k k)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

初心者です。 python,opencv しきい値処理でmedianBlurができない

解決したいこと

pyhon,opencvを用いた適応的しきい値処理を行いたいのですが、その過程途中にあるmedianBlurでエラーが発生してしまいます。
読み込む画像(g_2.4flat09944.jpg)は、ガンマ補正を行い、さらに適用的ヒストグラム平坦化を行ったRGB画像なのですが、これが原因でしょうか?
ご教授いただけると幸いです。
宜しくお願い致します。

発生している問題・エラー

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-14-4e4153b65295> in <module>
      4 
      5 img = cv2.imread("g_2.4flat09944.jpg")
----> 6 img = cv2.medianBlur(img,5)
      7 plt.imshow(img)

error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-9d_dfo3_\opencv\modules\imgproc\src\median_blur.dispatch.cpp:283: error: (-215:Assertion failed) !_src0.empty() in function 'cv::medianBlur'

該当するソースコード


```import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("g_2.4flat09944.jpg")
img = cv2.medianBlur(img,5)
plt.imshow(img)

### g_2.4flat09944.jpgに行ったガンマ補正と適用的ヒストグラム平坦化のコードものせておきます。 宜しくお願い致します。

import cv2
import sys
import numpy 
import matplotlib.pyplot as plt
%matplotlib inline
plt.gray()

img = cv2.imread('DSC09944.jpg',0)

def create_gamma_img(gamma, img):
  gamma_cvt = np.zeros((256,1), dtype=np.uint8)
  for i in range(256):
    gamma_cvt[i][0] = 255*(float(i)/255)**(1.0/gamma)
  return cv2.LUT(img, gamma_cvt)
img_ganma = create_gamma_img(2.4,img)
plt.imshow(img_ganma)

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img_ganma)
img_flat = cv2.imwrite("g_2.4flat09944.jpg",cl1)

1

1Answer

エラー文からは、変数imgが空であることを読み取ることができます。

!_src0.empty() in function 'cv::medianBlur'
ひとつめの引数がemptyだよ!

つまり、 5行目の img = cv2.imread("g_2.4flat09944.jpg") でうまく画像が読み込めていないことが要因だといえそうです。

cv2.imread()という関数は結構曲者で、実は画像のパスに誤りがあると Noneが返却されます。
(エラーが出力されないという罠…!)
なので、 print(img)print(type(img))print(img is None) などの出力結果から、きちんと読み込めたかを確認してみてください。

ソースを見たところでは g_2.4flat09944.jpg の打ち間違いではないようなので、それぞれのファイルの実行位置によるパスの差によるものかな?と推測します。
パスの違いによって読み込めないのもしょうもないので、以下のように直接変数を渡す形にしてみてもよいかと思います。

gamma.py
import cv2
import sys
import numpy as np

# ↓のmedian_blur.pyをimportしておく
import median_blur.plot

import matplotlib.pyplot as plt
%matplotlib inline
plt.gray()


img = cv2.imread('test.jpg',0)

def create_gamma_img(gamma, img):
    gamma_cvt = np.zeros((256,1), dtype=np.uint8)
    for i in range(256):
        gamma_cvt[i][0] = 255*(float(i)/255)**(1.0/gamma)
    return cv2.LUT(img, gamma_cvt)

img_ganma = create_gamma_img(2.4, img)
plt.imshow(img_ganma)

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img_ganma)

# cv2.imwrite関数の出力は画像ではなく
# 実行に成功したかどうかのTrue/Falseなので代入しても意味がない
# img_flat = cv2.imwrite("test_gamma.jpg",cl1)
cv2.imwrite("test_gamma.jpg", cl1)

# ↓の def plot(path, img): を呼び出し、画像の保存パスと変数を直接渡す
median_blur.plot("tesnt_median_blur.jpg", cl1)

gamma.pyと同じディレクトリに配置する

median_blur.py
import cv2
import numpy as np
from matplotlib import pyplot as plt

def plot(path, img):
    img = cv2.medianBlur(img, 5)
    cv2.imwrite(path, img)
    plt.imshow(img)

3Like

Your answer might help someone💌