Python зеркальное отображение изображений - PullRequest
0 голосов
/ 11 сентября 2009

Я делал зеркальное отображение изображений по горизонтальной и вертикальной осям. Теперь я собираюсь сделать диагональ.

Я сделал два по ширине по горизонтали и по вертикали для петель, которые в сценарии с горизонтальной разверткой проходят все пиксели по высоте и только половину пикселей по ширине. Затем он получает цвет пикселя и устанавливает тот же цвет для пикселя на другой стороне. Переход от getWidth(pic) к центру.

Тогда у меня есть зеркало в центре картинки. Как сделать диагональный путь?

Edit:

img_src = makePicture(pickAFile())
W = getWidth(img_src)
H = getHeight(img_src)

for x in range(W):
        for y in range(H):
                p = getPixel(img_src, x, y)
                colorInSrc = getColor( getPixel(img_src, x, y) )
                destPixel = getPixel(img_src, H-y-1, W-x-1)
                setColor(destPixel, colorInSrc)

Ответы [ 4 ]

2 голосов
/ 11 сентября 2009

Использование PIL (библиотеки изображений Python) - это относительно простая задача. Тем не менее, обратите внимание, что выходное изображение имеет квадратную форму, поэтому не соответствует размеру исходного изображения.

Вот код:

from PIL import Image, ImageDraw

# load the image, create the mirrored image, and the result placeholder
img    = Image.open('img.png')
mirror = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_90)
sz     = max(img.size + mirror.size)
result = Image.new(img.mode, (sz,sz))
result.paste(img, (0,0)+img.size)

# now paste the mirrored image, but with a triangular binary mask
mask = Image.new('1', mirror.size)
draw = ImageDraw.Draw(mask)
draw.polygon([0,0,0,sz,sz,sz], outline='white', fill='white')
result.paste(mirror, (0,0)+mirror.size, mask)

# clean up and save the result
del mirror, mask, draw
result.save('result.png')
1 голос
/ 11 сентября 2009

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

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

Редактировать : Небольшой пример. Скажем, вы начинаете с изображения шириной 5 пикселей и высотой 3 пикселя (5x3). Вам нужно будет создать новое пустое изображение шириной 3 пикселя и высотой 5 пикселей.

Если вы начнете нумерацию пикселей в левом верхнем углу с (0,0), то в новом изображении этот пиксель будет заканчиваться на (2,4), а пиксель (1,0) - на (2,3). и т. д.

Если ваши исходные ширина и высота W и H, то вы должны использовать что-то вроде этого:

for x in xrange(W):
    for y in xrange(H):
        p = img_src.getpixel(x, y)
        img_dest.setpixel(H-y-1, W-x-1)

Это должно работать, но не проверено.

1 голос
/ 11 сентября 2009

Это не вопрос Python, не правда ли?

Самым простым решением было бы сначала отразить горизонтальное, а затем вертикальное. Другой вариант - переключать строки пикселей столбцами.

Или сделать ваш алгоритм, но переключить пиксели с левого верхнего на нижний правый ...

0 голосов
/ 02 октября 2012

Вот как отразить по диагонали в JES; Это работает только для квадратного изображения:

def mirrorDiagonal(picture):
  for sourceX in range(0,getWidth(picture)):
    for sourceY in range (0,getHeight(picture)):
      pex=getPixel(picture,sourceY,sourceX) 
      pix=getPixel(picture, sourceX,sourceY)
      color=getColor(pix)
      setColor(pex,color)
  show(picture)
...