gpt4 book ai didi

使用 Numpy 仅出现在浮雕图像上的 Python 错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:13 25 4
gpt4 key购买 nike

此程序的目的是拍摄 ppm 图像并对其进行浮雕。 (可以找到整个项目的详细信息 here)我正在帮助作业评分,但似乎找不到学生的错误。

我使用的原始图像如下所示: enter image description here

结果应该是这样的:

enter image description here

这是整个程序(在问题行周围有注释):

# making an image embossed 

import numpy
def clamp(color):
if color<0:
return 0
elif color>255:
return 255
else:
return color
def get_num(jen):
variable = ''
ch = gwen.read(1)
while ch.startswith('#'):
while ch!='\n':

ch=gwen.read(1)
while ch.isspace():
ch = gwen.read(1)
while ch.isspace():
ch = gwen.read(1)
while ch.isdigit():

variable = variable + ch
ch=gwen.read(1)
if ch.startswith('#'):
while ch!='\n':

ch=gwen.read(1)

return int(variable)

def emboss(x,y):
d=numpy.empty((h,w*3),numpy.uint8)
print "len x[0]=",len(x[0])
print "len y=", len(y)
print "len y[0]=", len(y[0])
for i in xrange(len(x)):
for j in xrange(0,len(x[0]),3):
for k in xrange(3): #r,g,b loop
#if the next line is used a correct (but not embosed) image results
#d[i][j+k] = x[i][j+k]
sum = 0
for l in xrange(0,3,1):
for m in xrange(0,3,1):
#the next line embosses but causes a triple image in the process
sum = sum + ((x[(i+(l-1))%h][((j+k)+((m-1)*3))%w]) * y[l][m])

#the line below adjusts an embossed images brightness
#if not embossing comment out this line
d[i][j+k]=clamp(sum+127)


return d


name=raw_input('Please enter input name: ')
output= raw_input('Please enter output name: ')
gwen=open(name,"rb")

ch=gwen.read(1)
if ch=='P':
print ('This is P')
else:
print('Error in Header')
ch=gwen.read(1)
if ch=='6':
print ('This is 6')
else:
print('Error in Header')
jen=''

w=get_num(jen)
w=int(w)
print w
h=get_num(jen)
h=int(h)
print h
value=get_num(jen)
value=int(value)
print value

joe=open(output,"wb")
joe.write('P6'+' '+str(w)+' '+str(h)+' '+str(value)+'\n')



a=numpy.fromfile(gwen,numpy.uint8, w*h*3,'')
c=numpy.reshape(a,(h,w*3))
d=numpy.array([[1,1,1],[0,0,0],[-1,-1,-1]])
new=emboss(c,d)

for i in xrange(h):
for j in xrange(0,w*3,3):
r_value = new[i][j]
r=int(clamp(r_value))
g_value = new[i][j+1]
g=int(clamp(g_value))
b_value = new[i][j+2]
b=int(clamp(b_value))
joe.write('%c%c%c'%(r,g,b))

gwen.close()
joe.close()

在我看来问题出在浮雕方法中,但我似乎无法修复它。所以我包括了所有内容,甚至包括过滤掉 ppm 标题注释的部分。

就像现在一样,它会浮雕,但这样做会产生三重图像。当压纹线被移除时,三重图像消失。

这里是 file我正在测试你是否想自己尝试一下

关于我应该更改什么以修复错误的任何建议?

最佳答案

这是一个更清晰的浮雕函数版本

# renamed
# x -> im (the input image numpy array)
# y -> kernel (the emboss kernel)
# i -> y (the y coordinate)
# j -> x (the x coordinate)
# d -> output (the output numpy array)
# k -> color (the number of the color channel 0-2)
# sum -> sum_ (sum is a built-in, so we shouldn't use that name)
def emboss(im,kernel):
output=numpy.empty((h,w*3),numpy.uint8)
print "len im[0]=",len(im[0])
print "len kernel=", len(kernel)
print "len kernel[0]=", len(kernel[0])
for y in xrange(len(im)):
for x in xrange(0,len(im[0]),3):
for color in xrange(3): #r,g,b loop
#if the next line is used a correct (but not embosed) image results
#output[y][x+color] = im[y][x+color]
sum_ = 0
for l in xrange(0,3,1):
for m in xrange(0,3,1):
#the next line embosses but causes a triple image in the process
sum_ += (im[(y+(l-1))%h][((x+color)+((m-1)*3))%w]) * kernel[l][m]

#the line below adjusts an embossed images brightness
#if not embossing comment out this line
output[y][x+color]=clamp(sum_+127)
return output

bug好像在这一行

sum_ += (im[(y+(l-1))%h][((x+color)+((m-1)*3))%w]) * kernel[l][m]

其中 x 坐标由 w(以像素为单位的图像宽度)mod 编辑。 x-coord 在 0-1920 之间变化(由于 3 channel 颜色),而图像宽度仅为 640px。 修改 (w*3) 应该可以解决这个问题。

这是对原始代码的修复:

sum = sum + ((x[(i+(l-1))%h][((j+k)+((m-1)*3))%(w*3)]) * y[l][m])

关于使用 Numpy 仅出现在浮雕图像上的 Python 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20038641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com