2017-08-24 4 views
0

TypeError例外ではありません:srcがnumpyの配列ではないではありません、どちらもスカラー例外TypeError:srcがnumpyの配列、どちらもスカラー

gray_image = cv2.cvtColor(contrast, cv2.COLOR_BGR2GRAY) 

私は現在、これを解決するために働いている、任意の助けいただければ幸いです。コメントで述べたように、PILイメージはCV2形式に変換する必要があります。以下の例を使用して誰でも説明を提供できますか?

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
from cycler import cycler 
from PIL import Image, ImageEnhance 

# Loads the image then enhances it 
image = Image.open('lineCapture.png') 
contrast = ImageEnhance.Contrast(image) 

# Reads the enhanced image and converts it to grayscale, creates new file 
gray_image = cv2.cvtColor(contrast, cv2.COLOR_BGR2GRAY) //there is a problem here 
cv2.imwrite('enhancedGrayscaleLineCapture.png', gray_image) 

# Adaptive Gaussian Thresholding 
th1 = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 
     cv2.THRESH_BINARY,11,2) 
# Otsu's thresholding 
ret2,th2 = cv2.threshold(gray_image,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
# Otsu's thresholding after Gaussian filtering 
blur = cv2.GaussianBlur(gray_image,(5,5),0) 
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

# writes enhanced and thresholded img 
cv2.imwrite('enhancedGrayscaleThresholdLineCapture.png', th2) 
+0

スレッショルドのある画像を見たい場合は、これを最終画像の書き込みに変更してください。 cv2.imwrite( 'enhancedGrayscaleThresholdCapture.png'、th2) –

+1

@ I.Newtonありがとうございます。 – lizardwizard

+0

@ I.Newtonここで画像の書き込み量を制御するにはどうすればよいですか?私が実行すると、私は本当に必要のないディスクに3つのファイルを書き込む。私は最後の拡張キャプチャが必要です。 – lizardwizard

答えて

1

PILはほぼ完全にオブジェクト指向であるため、ほとんどの関数がオブジェクトを返します。例えば

>>> image = Image.open('img6.png') 
>>> type(image) 
<class 'PIL.PngImagePlugin.PngImageFile'> 

PIL Imageクラス(したがって資本)であるので、オブジェクトを返します。したがって、画像がオブジェクトの場合、画像データ、画像の高さ/幅などのプロパティと、画像を表示する.show()などの組み込みメソッドがあると考えられます。詳細については、read the docs for the PIL Image classをご覧ください。

したがって、配列を必要とする関数にクラスを渡しています。そこに問題が起こる。これを解決する1つの方法は、image.getdata()を使用してデータを数値配列に読み込むことです。これはPILのピクセル値にアクセスする通常の方法です。

しかし、numpyのは、自動的にシンプルなコマンドであなたのための配列にImageを変換します:np.asarray()

>>> image = Image.open('img6.png') 
>>> type(image) 
<class 'PIL.PngImagePlugin.PngImageFile'> 
>>> image_data = np.asarray(image) 
>>> type(image_data) 
<class 'numpy.ndarray'> 

yay!これでイメージからの配列ができました。重要なことに、PILは画像を他のほとんどのライブラリのようにRGB画像として読み込みますが、OpenCVは実際にはBGRチャンネルの順序付けを使用します。そのため、OpenCVを使用して色に応じた方法で画像の書き込み、表示、または変更を行う場合は、最初と最後のチャンネルを交換する必要があります。

コントラスト調整を扱う1つの問題が残っています。

>>> contrast = ImageEnhance.Contrast(image) 
>>> type(contrast) 
<class 'PIL.ImageEnhance.Contrast'> 

しかし、これはImageオブジェクトをContrastオブジェクトを返し、ない:ImageEnhanceモジュールからContrastもオブジェクトを返します。実際にはあなたのコードは画像を変更していません。エンハンサーオブジェクトを作成するだけです。コントラスト調整を実際に実行する方法(そしてどれくらい強くしたいかという要素)を呼び出す必要があります。 docs for ImageEnhanceを確認してください:

All enhancement classes implement a common interface, containing a single method:

enhance(factor)

Returns an enhanced image.

Parameters:factor – A floating point value controlling the enhancement. Factor 1.0 always returns a copy of the original image, lower factors mean less color (brightness, contrast, etc), and higher values more. There are no restrictions on this value.

Return type:Image

この方法はImageを返しますので、私たちはその結果にnp.asarray()を実行することができます。valが別のImageクラス

  • 取得となりコントラスト強調オブジェクトとリターンに起動enhance(factor)コントラスト強調オブジェクト
  • を作成Imageクラス
    1. ロード画像:だから、最終的なパイプラインは次のようなものになるだろうコントラスト調整された画像データの数が少ない配列
    2. RGBからBGRへの変換
    3. 通常使用

    入力画像:

    Input image

    >>> pil_image = Image.open('img6.png') 
    >>> contrast_enhancer = ImageEnhance.Contrast(pil_image) 
    >>> pil_enhanced_image = contrast_enhancer.enhance(2) 
    >>> enhanced_image = np.asarray(pil_enhanced_image) 
    >>> r, g, b = cv2.split(enhanced_image) 
    >>> enhanced_image = cv2.merge([b, g, r]) 
    >>> cv2.imshow('Enhanced Image', enhanced_image) 
    >>> cv2.waitKey() 
    

    出力イメージ:

    Contrast Enhanced Image

  • +0

    カラーエンハンサーをもっとうまく実装する方法についての情報がたくさんありますが(根本的にありがとうございます)、根本的な問題がある限り、私は改善の後に画像をグレースケール化することに間違いを犯しています。 @AlexanderReynolds – lizardwizard

    +0

    また、 @AlexanderReynoldsに関する構文エラーが発生しました。 – lizardwizard

    +0

    回答を@lizardwizardとして受け入れます。 –

    1

    偉大な説明のためのアレクサンダー・レイノルズに感謝します。あなたのコードで間違いを見つけられないので、これをチェックしてください。

    import cv2 
    import numpy as np 
    from matplotlib import pyplot as plt 
    from cycler import cycler 
    from PIL import Image, ImageEnhance 
    
    # Loads the image then enhances it 
    image = Image.open('lineCapture.png') 
    contrast = ImageEnhance.Contrast(image) 
    img=contrast.enhance(2) 
    img = np.asarray(img) 
    r, g, b,a = cv2.split(img) 
    contrast=cv2.merge([b, g, r]) 
    # Reads the enhanced image and converts it to grayscale, creates new file 
    gray_image = cv2.cvtColor(contrast, cv2.COLOR_BGR2GRAY) #there is a problem here 
    
    
    # Adaptive Gaussian Thresholding 
    th1 = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 
         cv2.THRESH_BINARY,11,2) 
    # Otsu's thresholding 
    ret2,th2 = cv2.threshold(th1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
    # Otsu's thresholding after Gaussian filtering 
    blur = cv2.GaussianBlur(th2,(5,5),0) 
    ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
    
    # writes enhanced and thresholded img 
    cv2.imwrite('enhancedGrayscaleThresholdLineCapture.png', th3) 
    
    +0

    私は今や自分の道の誤りを見る!コントラストは大幅に更新されなければなりませんでした。これらの努力であなたの助けをありがとう – lizardwizard

    +0

    うれしい。誰もがある時点では、Pythonには新しいものでした。 –

    +1

    アドオンをご利用いただき、ありがとうございました。 –