コード内でエラーが発生しました(TypeError:整数スカラー配列のみがスカラーインデックスに変換できます)。enumerateオブジェクトを使用しているため、(unit8)を(int)に変換する必要があると思いましたが、同じエラーが発生し続けます。コードは次のとおりです。
import cv2
import numpy as np
B=8 # blocksize
img1 = cv2.imread(r'C:\Users\Leith\Desktop\Test Images\Goldhill_Final.bmp')
h,w=np.array(img1.shape[:2])/B * B
h=int(h)
w=int(w)
Trans_Color=cv2.cvtColor(img1, cv2.COLOR_BGR2LAB)
Trans_Color=Trans_Color.astype(int)
L,A,B=cv2.split(Trans_Color)
Three_Channels=[Trans_Color[:,:,0],A,B]
QY=np.array([[16,11,10,16,24,40,51,61],
[12,12,14,19,26,48,60,55],
[14,13,16,24,40,57,69,56],
[14,17,22,29,51,87,80,62],
[18,22,37,56,68,109,103,77],
[24,35,55,64,81,104,113,92],
[49,64,78,87,103,121,120,101],
[72,92,95,98,112,100,103,99]])
QC=np.array([[17,18,24,47,99,99,99,99],
[18,21,26,66,99,99,99,99],
[24,26,56,99,99,99,99,99],
[47,66,99,99,99,99,99,99],
[99,99,99,99,99,99,99,99],
[99,99,99,99,99,99,99,99],
[99,99,99,99,99,99,99,99],
[99,99,99,99,99,99,99,99]])
QF=99.0
if QF < 50 and QF > 1:
scale = np.floor(5000/QF)
elif QF < 100:
scale = 200-2*QF
else:
print("Quality Factor must be in the range [1..99]")
scale=scale/100.0
Q=[QY*scale,QC*scale,QC*scale]
TransAll=[]
TransAllQuant=[]
for idx,channel in enumerate(Three_Channels):
channelrows=channel.shape[0]
channelcols=channel.shape[1]
Trans = np.zeros((channelrows,channelcols), np.float32)
TransQuant = np.zeros((channelrows,channelcols), np.float32)
blocksV=channelrows/B
blocksH=channelcols/B
vis0 = np.zeros((channelrows,channelcols), np.float32)
vis0[:channelrows, :channelcols] = channel
vis0=vis0-128
for row in range(blocksV):
for col in range(blocksH):
currentblock = cv2.dct(vis0[row*B:(row+1)*B,col*B:(col+1)*B])
Trans[row*B:(row+1)*B,col*B:(col+1)*B]=currentblock
TransQuant[row*B:(row+1)*B,col*B:(col+1)*B]=np.round(currentblock/Q[idx])
TransAll.append(Trans)
TransAllQuant.append(TransQuant)
トレースバックは次のとおりです。
runfile( 'C:/ Users / Leith / Desktop / Malicious and Good Websites / FinalDataset / URL / untitled5.py'、wdir = 'C:/ Users / Leith / Desktop / Malicious and Good Websites / FinalDataset / URL')トレースバック(最後の最新の呼び出し):
ファイル "C:\ Users \ Leith \ Desktop \ Malicious and Good Websites \ FinalDataset \ URL \ untitled5.py"、65行目、範囲内の行(blocksV):
TypeError:整数のスカラー配列のみをスカラーインデックスに変換できます
それを修正する方法を模索するのを手伝ってくれませんか?私は感謝します!
エラーはここにあるはずです:
blocksV=channelrows/B
分割するとき、Pythonは整数を浮動小数点数に変換します。整数を整数で除算していて、結果が整数であると想定されている場合でも(たとえば、2ではなく4/2 = 2.0)。次に、浮動小数点型ではなく整数型を引数として受け入れるrange(blocksV)
ため、エラーが発生しrange
ます。
それblocksV
が整数であることを確認してください:次を使用できます:
blocksV=channelrows//B
(//
演算子に注意してください)整数型として、除算の整数部分(小数は切り捨てられます)のみを返します。
同じ問題が発生します blocksH=channelcols/B
編集
前のステートメントに加えて、あなたの本当の問題は変数の命名です。あなたはBを再定義しています。
B=8 # blocksize
...
L,A,B=cv2.split(Trans_Color)
したがって、for
ループを使用してコードの最新行でBを除算および乗算する場合、ブロックサイズを意味すると思いますが、実際にB
はcv2.split
。によって作成されたnumpy配列です。別の名前を使用する必要があります。
将来これを回避するには、より明示的な名前を使用する必要があります(1文字の名前は使用しないでください。この種のエラーを作成するのは、より困難になります)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加