Масштабирование части изображения

Я хочу увеличить часть изображения, в данном случае нос.

У меня есть функция выбора части изображения, которую я хочу увеличить.

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)

Копировать и вставить нос

У меня также есть функция увеличения изображения:

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

например.
От кого:

Исходное изображение

To:

Увеличенное изображение

Я пробовал много вещей, но не могу понять, как объединить их, чтобы увеличить часть изображения, оставив остальную часть изображения нетронутой.

Вот как должна выглядеть получившаяся картинка (как бы нелепо это ни было),

увеличенный нос

Я практиковался на небольших изображениях, так как выполнение программы может занять так много времени, что на данном этапе невозможно работать с большими изображениями, то есть результаты отрывочны, но, по крайней мере, покажут, работает ли это.


person Community    schedule 05.07.2013    source источник


Ответы (2)


Я все еще не уверен, что понимаю, что вы пытаетесь сделать, но я думаю, что это что-то вроде этого: вы хотите скопировать и вставить нос, а не вырезать и вставить, и вы хотите, чтобы вставленная копия дублировалась таким же своеобразным образом, как и во втором примере.

Итак, посередине лица будет нос 10х10, плюс размытый нос 20х20 справа внизу.


Во-первых, чтобы скопировать и вставить, вам просто нужно скопировать пиксели в старую и новую позиции, а не только в новую позицию:

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 становится равным 149,159, но пиксель с размером 50,60 становится равным 151,161, пиксель с размером 51,61 становится равным 153,163 и так далее.

Итак, вам нужно получить расстояние от 49,59, удвоить его, добавить обратно к 49,59, а затем переместить на 100 100:

      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)
person abarnert    schedule 05.07.2013

Это просто для протокола и для развлечения, а не ответ...

Но, как упоминалось 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?"), что довольно нелепо в качестве алгоритма масштабирования...

Гораздо более интересным, но базовым подходом к масштабированию изображения является Nearest Neighbor Algorithm.

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)



................................................введите здесь описание изображения............................ ............введите здесь описание изображения........ ...................................


Другие интересные алгоритмы здесь.


Вот базовая реализация 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

Оригинал:

введите здесь описание изображения

Ближайший сосед:

введите здесь описание изображения

Орел:

введите здесь описание изображения


Наслаждаться!

person Gauthier Boaglio    schedule 06.07.2013