主界面
图像扫描
扫描是最基本的特效显示方式,它没有划分图像块,只是顺序地一行一行或一列一列地显示图像或清除图像。
向下扫描、向上扫描、向右扫描、向左扫描。四种扫描的原理相同。只是显示图像的次序不同。
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)