Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之一 哈哈镜效果
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之一 哈哈镜效果
一、简单介绍
二、简单哈哈镜实现的原理
1、图像拉伸放大
2、图像缩小
三、哈哈镜 拉伸放大 代码实现
四、哈哈镜 图像缩小 代码实现
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、简单哈哈镜实现的原理
现实生活中的哈哈镜,是指一种表面凸凹不平的镜子,可以反映出人像及物件的扭曲面貌。在图像处理中,哈哈镜效果是通过图像坐标变换来模拟真实的哈哈镜效果。具体算法过程如下:
输入图像f(x,y),宽高分别为Width和Height,设置图像中心坐标Center(cx,xy)为缩放中心点,图像上任意一点到中心点的相对坐标tx=x-cx,ty=y-cy。哈哈镜效果分为图像拉伸放大和图像缩小。
1、图像拉伸放大
对于图像拉伸放大,设置图像变换的半径为radius,哈哈镜变换后的图像为p(x,y)。
2、图像缩小
对于图像缩小,设置图像变换的半径为radius,哈哈镜变换后的图像为p(x,y)。
三、哈哈镜 拉伸放大 代码实现
1、编写代码
2、运行效果
3、具体代码
import cv2
import mathdef EnlargeEffectMirror(img, radius):"""哈哈镜放大效果:param img: 图片:param radius: 半径:return: 变化后的数据"""# 获取图片的高、宽、和维度h, w, n = img.shapecx = w / 2cy = h / 2r = int(radius / 2.0)new_img = img.copy()# 遍历调整图片for i in range(w):for j in range(h):tx = i - cxty = j - cydistance = tx * tx + ty * tyif distance < radius * radius:x = int(int(tx / 2.0) * (math.sqrt(distance) / r) + cx)y = int(int(ty / 2.0) * (math.sqrt(distance) / r) + cy)if x < w and y < h:new_img[j, i, 0] = img[y, x, 0]new_img[j, i, 1] = img[y, x, 1]new_img[j, i, 2] = img[y, x, 2]return new_imgdef TestEnlargeEffectMirror():"""测试哈哈镜放大效果:return: null"""img = cv2.imread("Images/DogFace.jpg")# 设置窗口属性,并显示图片cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)cv2.imshow("Dog", img)# 该值可以自行定义,它决定了哈哈镜的大小,当图像很大时,应该相应的调大enlarge_img = EnlargeEffectMirror(img, 400)# 设置窗口属性,并显示图片cv2.namedWindow("enlarge_img", cv2.WINDOW_KEEPRATIO)cv2.imshow("enlarge_img", enlarge_img)def main():TestEnlargeEffectMirror()cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()
需要注意的是:
- 1)因为涉及很多浮点运算,所以需要加上转int()函数,保证最后的图像坐标为非负整数。
- 2)另外,由于计算可能会导致最终的newx和newy出现超过图像范围的坐标,因此需要加if语句来确保图像遍历成功。
四、哈哈镜 图像缩小 代码实现
1、编写代码
2、运行效果
3、具体代码
def ReduceEffectMirror(img, compress):"""哈哈镜缩小效果:param img::param compress: 图像缩小数值,越大,压缩越严重:return:"""height, width, n = img.shapecenter_x = width / 2center_y = height / 2new_data = img.copy()# 图像遍历for i in range(width):for j in range(height):tx = i - center_xty = j - center_ytheta = math.atan2(ty, tx)radius = math.sqrt((tx * tx) + (ty * ty))newx = int(center_x + (math.sqrt(radius) * compress * math.cos(theta)))newy = int(center_y + (math.sqrt(radius) * compress * math.sin(theta)))# 防止计算后坐标小于0if newx < 0 and newx > width:newx = 0if newy < 0 and newy > height:newy = 0if newx < width and newy < height:new_data[j, i][0] = img[newy, newx][0]new_data[j, i][1] = img[newy, newx][1]new_data[j, i][2] = img[newy, newx][2]return new_datadef TestReduceEffectMirror():"""测试哈哈镜缩小效果:return: null"""img = cv2.imread("Images/DogFace.jpg")# 设置窗口属性,并显示图片cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)cv2.imshow("Dog", img)# 该值可以自行定义,它决定了哈哈镜的大小,当图像很大时,应该相应的调大reduce_img = ReduceEffectMirror(img, 12)# 设置窗口属性,并显示图片cv2.namedWindow("reduce_img", cv2.WINDOW_KEEPRATIO)cv2.imshow("reduce_img", reduce_img)def main():TestReduceEffectMirror()cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()