代码中的错误(只有整数标量数组才能转换为标量索引)

2024-09-28 21:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个代码中遇到了一个错误,它属于(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/恶意和良好网站/FinalDataset/URL/untitled5.py',wdir='C:/Users/Leith/Desktop/恶意和良好网站/FinalDataset/URL') 回溯(最近一次呼叫最后一次):

文件“C:\Users\Leith\Desktop\malistic and Good Websites\FinalDataset\URL\untitled5.py”,第65行,在 对于范围内的行(blocksV):

TypeError:只能将整数标量数组转换为标量索引

请你帮我找个办法把它修好好好吗?我会很感激的


Tags: transnpcolcv2userscolorintrow
1条回答
网友
1楼 · 发布于 2024-09-28 21:19:07

错误应该在这里:

blocksV=channelrows/B

除法时,python将整数转换为浮点。即使将整数除以整数,并且结果应该是整数(例如,4/2=2.0而不是2)。然后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数组。您需要使用不同的名称

为了避免将来出现这种情况,您应该使用更显式的名称(没有单个字母的名称,这样做会更加困难)

相关问题 更多 >