我使用的原始图像如下所示:
结果应如下所示:
这是整个程序(围绕问题行的评论):
# making an image embossed import numpy def clamp(color): if color<0: return 0 elif color>255: return 255 else: return colordef 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,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 dname=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 hvalue=get_num(jen)value=int(value)print valuejoe=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],[-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,b))gwen.close()joe.close()
在我看来问题是在浮雕方法,但我似乎无法解决它.因此,我将其全部包含在过滤掉ppm标题注释的部分中.
就像现在一样,它会浮雕,但这样做会产生三重图像.
当去除压花线时,三重图像消失.
这是我正在测试的file,如果你想自己尝试一下
有什么建议我应该改变什么来修复BUG?
解决方法 这是一个更清洁版的浮雕功能# 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,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,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,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-coord由w模式化(图像宽度以像素为单位). x-coord在0-1920之间变化(由于3通道颜色),而图像宽度仅为640px.通过(w * 3)修改应该纠正问题.
这是原始代码的修复:
sum = sum + ((x[(i+(l-1))%h][((j+k)+((m-1)*3))%(w*3)]) * y[l][m])总结
以上是内存溢出为你收集整理的Python bug只会出现在使用Numpy的浮雕图像上全部内容,希望文章能够帮你解决Python bug只会出现在使用Numpy的浮雕图像上所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)