Pictu的缩放部分

2024-06-28 19:22:43 发布

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

我想放大图片的一部分,在这个例子中,是鼻子。

我有一个函数来选择要放大的部分。

def copyAndPaste(picture):
  height = getHeight(picture)
  width = getWidth(picture)
  newPicture = makeEmptyPicture(width, height)
  for x in range(width):
    for y in range(height):
      pxl = getPixel(picture,x,y)
      if (x>48 and x<59) and (y>58 and y<71):
        newPxl =getPixel(newPicture, #?,#?)
      else:
        newPxl = getPixel(newPicture, x,y)
      color = getColor(pxl)
      setColor(newPxl,color)

  return newPicture

def d():    
  f=pickAFile()
  picture=makePicture(f)        
  newPicture = copyAndPaste(picture)        
  writePictureTo(newPicture, r"D:\FOLDER\0Pic4.jpg")
  explore (newPicture)

Copy paste nose

我还有一个放大图片的功能:

def Enlarge(picture):
  height = getHeight(picture)
  width = getWidth(picture)
  newPicture = makeEmptyPicture(width*2, height*2)
  x1=0
  for x in range(0,width):
    y1=0
    for y in range(0,height):
      pxl = getPixel(picture,x,y)
      newPxl = getPixel(newPicture, x1,y1)
      color = getColor(pxl)
      setColor(newPxl,color)

      y1=y1+2
    x1=x1+2

  return newPicture

例如
发件人:

Original Pic

致:

Enlarged Pic

我试过很多方法,但都不知道如何把这两种方法结合起来放大一张照片的一部分,而把剩下的部分保留下来。

这就是最终的图片应该看起来的样子(尽管它很可笑)

enlarged nose

我一直在练习小图片,因为程序执行起来可能要花很长时间,用大图片是不可行的,在这个阶段,意味着结果是粗略的,但至少会显示它是否有效。


Tags: infordef图片rangewidthcolorx1
2条回答

我仍然不确定我是否理解你想做的,但我认为是这样的:你想复制粘贴鼻子,而不是剪切粘贴,你想把粘贴好的复制品以和你的第二个例子一样的方式翻倍。

所以,在脸中间会有一个10x10的鼻子,再加上一个20x20洗出来的鼻子在右下方。


首先,要复制和粘贴,只需将像素复制到新旧位置,而不是仅复制到新位置:

def copyAndPaste(picture):
  height = getHeight(picture)
  width = getWidth(picture)
  newPicture = makeEmptyPicture(width+100, height+100)
  for x in range(width):
    for y in range(height):
      pxl = getPixel(picture,x,y)
      color = getColor(pxl)
      if (x>48 and x<59) and (y>58 and y<71):
        newPxl =getPixel(newPicture, x+100,y+100)
        setColor(newPxl,color)
      newPxl = getPixel(newPicture, x,y)
      setColor(newPxl,color)

现在,要放大新粘贴的副本,只需将偏移量加倍即可。换句话说,49,59处的第一个像素转到149159,但50,60处的像素转到151161,51,61处的像素转到153163,依此类推。

所以,你想要的是得到49,59之间的距离,加倍,再加回到49,59,然后移动100100:

      if (x>48 and x<59) and (y>58 and y<71):
        newPxl =getPixel(newPicture, (x-49)*2+49+100,(y-59)*2+59+100)
        setColor(newPxl,color)

这只是为了记录和娱乐,不是答案。。。

但是正如前面提到的,abarnert"Are you sure they just want you to leave 3 white pixels for every copied pixel, rather than copying the same pixel 4 times?"),作为一个缩放算法,这是非常荒谬的。。。

更有趣但更基本的缩放图像的方法是^{}

def EnlargeNearestNeighbor(picture, multiplier):

  w1 = getWidth(picture)
  h1 = getHeight(picture)
  w2 = getWidth(picture) * multiplier
  h2 = getHeight(picture) * multiplier

  x_ratio = w1/float(w2)
  y_ratio = h1/float(h2)

  newPicture = makeEmptyPicture(w2, h2)

  for x in range(0, w2):
    for y in range(0, h2):
      newPx = getPixel(newPicture, x, y)

      px = floor(x*x_ratio);
      py = floor(y*y_ratio);

      oldPx = getPixel(picture, int(px), int(py))
      setColor(newPx, getColor(oldPx))

  return newPicture

file = pickAFile()
picture = makePicture(file)
pic = EnlargeEagle(picture)

pic2 = EnlargeNearestNeighbor(picture, 3)



………enter image description here………enter image description here。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


其他有趣的算法here


这里是Eagle Algorithm的一个基本实现(可以很好地处理具有少量不同颜色的图像):

def EnlargeEagle(picture):

  w = getWidth(picture)
  h = getHeight(picture)
  w2 = getWidth(picture)*2
  h2 = getHeight(picture)*2

  newPicture = makeEmptyPicture(w2, h2)

  x2 = 0
  for x in range(1, w-1):
    y2 = 0
    for y in range(1, h-1):

      oldPxS = getPixel(picture, x-1, y-1)
      oldPxT = getPixel(picture, x, y-1)
      oldPxU = getPixel(picture, x+1, y-1)

      oldPxV = getPixel(picture, x-1, y)
      oldPxC = getPixel(picture, x, y)
      oldPxW = getPixel(picture, x+1, y)

      oldPxX = getPixel(picture, x-1, y+1)
      oldPxY = getPixel(picture, x, y+1)
      oldPxZ = getPixel(picture, x+1, y+1)

      newPx1 = getPixel(newPicture, x2, y2)
      newPx2 = getPixel(newPicture, x2+1, y2)
      newPx3 = getPixel(newPicture, x2, y2+1)
      newPx4 = getPixel(newPicture, x2+1, y2+1)

      # Step 1
      c = getColor(oldPxC)
      setColor(newPx1, c)
      setColor(newPx2, c)
      setColor(newPx3, c)
      setColor(newPx4, c)

      # Step 2      
      if (getColor(oldPxV) == getColor(oldPxS)) and (getColor(oldPxS) == getColor(oldPxT)):
         setColor(newPx1, getColor(oldPxS))

      if (getColor(oldPxT) == getColor(oldPxU)) and (getColor(oldPxU) == getColor(oldPxW)):
         setColor(newPx2, getColor(oldPxU))

      if (getColor(oldPxV) == getColor(oldPxX)) and (getColor(oldPxX) == getColor(oldPxY)):
         setColor(newPx3, getColor(oldPxX))

      if (getColor(oldPxW) == getColor(oldPxZ)) and (getColor(oldPxZ) == getColor(oldPxY)):
         setColor(newPx4, getColor(oldPxZ))



  y2 += 2
x2 += 2

原件:

enter image description here

最近的邻居:

enter image description here

鹰:

enter image description here


享受吧!

相关问题 更多 >