python 图像特效

主界面

在这里插入图片描述

图像扫描

扫描是最基本的特效显示方式,它没有划分图像块,只是顺序地一行一行或一列一列地显示图像或清除图像。
向下扫描、向上扫描、向右扫描、向左扫描。四种扫描的原理相同。只是显示图像的次序不同。

   self.lb_2.setPixmap(QPixmap(""))
   # 绘制图像
   image = self.image.xBitmap.img_org
   image = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA)
   h, w, c = image.shape
   img = np.zeros((h, w, c), dtype=np.uint8)
   if flag == "xia":
       for j in range(h):
           img[j] = image[j]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)
   elif flag == "shang":
       for j in range(h - 1, -1, -1):
           img[j] = image[j]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)
   elif flag == "zuo":
       for i in range(w - 1, -1, -1):
           img[:, i] = image[:, i]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)
   elif flag == "you":
       for i in range(w):
           img[:, i] = image[:, i]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)

在这里插入图片描述
在这里插入图片描述

图像移动

移动是将图像看做一个整体, 显示时不能像扫描那样, 扫描方式有些像打开一幅画。
例如从上向下平移时, 必须先显示下面的图像, 后显示上面的图像。
在这里插入图片描述

   if flag == "you":
       for j in range(w):
           img[:, 0:j+1] = image[:, w - 1 - j:]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)
   elif flag == "zuo":
       for j in range(w):
           img[:,  w - 1 - j:] = image[:,0:j+1]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)

   elif flag == "shang":
       for j in range(h):
           img[h - 1 - j:] = image[0:j+1]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)
   elif flag == "xia":
       for j in range(h):
           img[0:j+1] = image[h - 1 - j:]
           XImage.imShow(img, self.lb_2)
           cv2.waitKey(10)

交叉飞入

交叉飞入是将图像平分成上下两部分, 在显示时上部分水平右移, 下部分水平左移。因此 交叉分入的基本原理和平移是相同的, 其不同之处只是将图像进行了分块。
在这里插入图片描述

	for j in range(w):
	    img[0:k,0: j +1] = image[0:k, w - 1 - j:]  # you
	    img[k:, w - 1 - j:] = image[k:, 0:j+1]  # zuo
	    XImage.imShow(img, self.lb_2)
	    cv2.waitKey(10)
            

中间扩张

从屏幕中间开始, 向上下两方向展开显示。这种效果就是中间扩张。
在这里插入图片描述

   for j in range(k - 1, -1, -1):
       img[j, :] = image[j, :]
       img[h-1-j, :] = image[h-1-j, :]
       XImage.imShow(img, self.lb_2)
       cv2.waitKey(10)

中间收缩

中间收缩的效果是从屏幕的上下两边同时向中间扫描。
在这里插入图片描述

   for j in range(k):
       img[j, :] = image[j, :]
       img[h-1-j, :] = image[h-1-j, :]
       XImage.imShow(img, self.lb_2)
       cv2.waitKey(10)

栅条

栅条特效分为水平栅条和垂直栅条, 其效果像是将两手交叉的过程。
在这里插入图片描述
在这里插入图片描述

   for j in range(w):
       for k in range(0 ,h,2*nscanline):
           img[k:k+nscanline, 0: j +1] = image[k:k+nscanline,w - 1 - j:]  # you
           img[k+nscanline:k+nscanline+nscanline, w - 1 - j:] = image[k+nscanline:k+nscanline+nscanline, 0:j+1]  # zuo
       XImage.imShow(img, self.lb_2)
       cv2.waitKey(1)

渐显

也就是图片内容从虚无逐步清晰的过程。
在这里插入图片描述

   for n in range(101):
         img[:, :, 0:3] = image[:, :, 0:3] * (n / 100)
         img[:, :, -1] = 255
         XImage.imShow(img.astype(np.uint8), self.lb_2)
         cv2.waitKey(20)
         print(img.astype(np.uint8))

百叶窗

顾名思义, 百叶窗显示的效果同我们生活中真正的百叶窗有些类似。
在这里插入图片描述在这里插入图片描述

   for j in range(nscanline):
        for k in range(0, h, nscanline):
            img[min(k + j,h-1),:] = image[ min(k + j,h-1),:]  
        XImage.imShow(img, self.lb_2)
        cv2.waitKey(10)

马赛克

马赛克显示是图像被分成许多小区域, 显示时小区域以杂乱无章的顺序显示在屏幕上。

在这里插入图片描述

   if w % 12 != 0:
       nrw = 1
   if h % 12 != 0:
       nrh = 1
   points = []

   ltilenum = int((w / 12 + nrw) * (h / 12 + nrh));
   for i in range(ltilenum):
       points.append(Point(0, 0))

   for mi in range(ltilenum):
       points[mi].x = mx
       points[mi].y = my
       mx = mx + 12
       if mx > w:
           mx = 0
           my = my + 12
   for i in range(1):
       for mi in range(ltilenum-1,-1,-1):
           n=  np.random.randint(0, ltilenum, 1)[0]
           mx=points[n].x
           my=points[n].y
           img[my:my+12,mx:mx+12]=image[my:my+12,mx:mx+12]
           XImage.imShow(img,self.lb_2)
           # points[n].x = points[mi].x;
           # points[n].y = points[mi].y;
           # cv2.waitKey(10)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值