我在一个代码中遇到了一个错误,它属于(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:只能将整数标量数组转换为标量索引
请你帮我找个办法把它修好好好吗?我会很感激的
错误应该在这里:
除法时,python将整数转换为浮点。即使将整数除以整数,并且结果应该是整数(例如,4/2=2.0而不是2)。然后
range(blocksV)
会引发一个错误,因为range
接受整数类型作为参数,而不是浮点类型确保
blocksV
是一个整数:您可以使用:(注意
//
运算符),它只返回除法的整数部分(任何小数都被截断),作为整数类型您将在
blocksH=channelcols/B
上遇到同样的问题编辑
除了前面的语句之外,真正的问题是变量的命名。你正在重新定义B
因此,当您在代码的最新几行中用
for
循环除以B,我认为您指的是块大小,但实际上B
是由cv2.split
创建的numpy数组。您需要使用不同的名称为了避免将来出现这种情况,您应该使用更显式的名称(没有单个字母的名称,这样做会更加困难)
相关问题 更多 >
编程相关推荐