python曲线镜像_在Python中以对角方式镜像图像

只是分享一种对角镜像方式,从左下角到右上角:

如果他需要从“右上角到左下角”镜像或使用相反的对角线,学生负责适应。

# !! Works only with squared pictures... !!

def diagMirrorPicture(picture):

height = getHeight(picture)

width = getWidth(picture)

if (height != width):

printNow("Error: The input image is not squared. Found [" + \

str(width) + " x " + str(height) + "] !")

return None

newPicture = makeEmptyPicture(width, height)

mirrorPt = 0

for x in range(0, width, 1):

for y in range(mirrorPt, height, 1):

sourcePixel = getPixel(picture, x, y)

color = getColor(sourcePixel)

# Copy bottom-left as is

targetPixel = getPixel(newPicture, x, y)

setColor(targetPixel, color)

# Mirror bottom-left to top right

targetPixel = getPixel(newPicture, y, x)

# ^^^^ (simply invert x and y)

setColor(targetPixel, color)

# Here we shift the mirror point

mirrorPt += 1

return newPicture

file = pickAFile()

picture = makePicture(file)

picture = diagMirrorPicture(picture)

if (picture):

writePictureTo(picture, "/home/mirror-diag2.png")

show(picture)注意:这表现为我们独立地为每行像素操作垂直镜像,沿垂直轴传递mirrorPt点。

输出(由Antoni Tapies绘画):

.................

.................

.............. ....

以下是实验性的,只是为了好玩......

# Draw point, with check if the point is in the image area

def drawPoint(pic, col, x, y):

if (x >= 0) and (x < getWidth(pic)) and (y >= 0) and (y < getHeight(pic)):

px = getPixel(pic, x, y)

setColor(px, col)

# Draw line segment given two points

# From Bresenham's line algorithm :

# http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

def drawLine(pic, col, x0, y0, x1, y1):

dx = abs(x1-x0)

dy = abs(y1-y0)

sx = sy = 0

#sx = 1 if x0 < x1 else -1

#sy = 1 if y0 < y1 else -1

if (x0 < x1):

sx = 1

else:

sx = -1

if (y0 < y1):

sy = 1

else:

sy = -1

err = dx - dy

while (True):

drawPoint(pic, col, x0, y0)

if (x0 == x1) and (y0 == y1):

break

e2 = 2 * err

if (e2 > -dy):

err = err - dy

x0 = x0 + sx

if (x0 == x1) and (y0 == y1):

drawPoint(pic, col, x0, y0)

break

if (e2 < dx):

err = err + dx

y0 = y0 + sy

# Works only with squared cropped areas :

# i.e. in [(x0, y0), (x1, y1)], abs(x1-x0) must be equal to abs(y1-y0)

#

# USAGE :

# * To get bottom reflected to top use x0 > x1

# * To get top reflected to bottom use x0 < x1

def diagCropAndMirrorPicture(pic, startPt, endPt):

w = getWidth(pic)

h = getHeight(pic)

if (startPt[0] < 0) or (startPt[0] >= w) or \

(startPt[1] < 0) or (startPt[1] >= h) or \

(endPt[0] < 0) or (endPt[0] >= w) or \

(endPt[1] < 0) or (endPt[1] >= h):

printNow("Error: The input points must be in the image range !")

return None

new_w = abs(startPt[0] - endPt[0])

new_h = abs(startPt[1] - endPt[1])

if (new_w != new_h):

printNow("Error: The input points do not form a square !")

return None

printNow("Given: (" + str(startPt[0]) + ", " + str(endPt[0]) + ") and (" \

+ str(startPt[1]) + ", " + str(endPt[1]) + ")")

newPicture = makeEmptyPicture(new_w, new_h)

if (startPt[0] < endPt[0]):

offsetX = startPt[0]

switchX = False

switchTB = True

else:

offsetX = endPt[0]

switchX = True

switchTB = False

if (startPt[1] < endPt[1]):

offsetY = startPt[1]

switchY = False

else:

offsetY = endPt[1]

switchY = True

# (switchX XOR switchY)

changeDiag = (switchX != switchY)

mirror_pt = 0

for x in range(0, new_w, 1):

for y in range(mirror_pt, new_h, 1):

#for y in range(0, new_h, 1):

oldX = x

oldY = y

if (switchTB):

sourcePixel = getPixel(picture, offsetX+new_w-1- oldX, offsetY+new_h-1- oldY)

else:

sourcePixel = getPixel(picture, offsetX+oldX, offsetY+oldY)

color = getColor(sourcePixel)

if (changeDiag):

newX = new_w-1 - x

newY = new_h-1 - y

#printNow("Change Diag !")

else:

newX = x

newY = y

# Copied half

if (switchTB):

targetPixel = getPixel(newPicture, new_w-1- x, new_h-1- y)

else:

targetPixel = getPixel(newPicture, x, y)

setColor(targetPixel, color)

# Mirror half (simply invert x and y)

if (switchTB):

targetPixel = getPixel(newPicture, new_h-1- newY, new_w-1- newX)

else:

targetPixel = getPixel(newPicture, newY, newX)

setColor(targetPixel, color)

# Here we shift the mirror point

if (not changeDiag):

mirror_pt += 1

return newPicture

file = pickAFile()

pic = makePicture(file)

picture = makePicture(file)

# Draw working area

drawLine(pic, white, 30, 60, 150, 180)

drawLine(pic, white, 30, 180, 150, 60)

drawLine(pic, black, 30, 60, 30, 180)

drawLine(pic, black, 30, 60, 150, 60)

drawLine(pic, black, 150, 60, 150, 180)

drawLine(pic, black, 30, 180, 150, 180)

show(pic)

writePictureTo(pic, "D:\\pic.png")

# Build cropped and mirrored areas

pic1 = diagCropAndMirrorPicture(picture, (150, 60), (30, 180))

pic2 = diagCropAndMirrorPicture(picture, (30, 180), (150, 60))

pic3 = diagCropAndMirrorPicture(picture, (150, 180), (30, 60))

pic4 = diagCropAndMirrorPicture(picture, (30, 60), (150, 180))

# Show cropped and mirrored areas

if (pic1):

writePictureTo(pic1, "D:\\pic1.png")

show(pic1)

if (pic2):

writePictureTo(pic2, "D:\\pic2.png")

show(pic2)

if (pic3):

writePictureTo(pic3, "D:\\pic3.png")

show(pic3)

if (pic4):

writePictureTo(pic4, "D:\\pic4.png")

show(pic4)

.................................................. ....

............................................. .........

.......

..........

..........

..........

.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值