'''
created by riantr on 20210329
Usage: python gen_zigzag_from_any_img.py [img]
'''
import cv2
import numpy as np
import sys
def ZigZag(img):
def get_lower(img):
height,width = img.shape[:2]
gradient = 1.0*height/width
points = []
values = []
means = []
for j in range(0,height,1):
line_points = []
line_values = []
for i in range(0,height,1):
y = height-1 - i -j
x = int(i/gradient)
if x*y >= 0:
line_points.append([y,x])
line_values.append(img[y][x])
points.append(line_points)
values.append(line_values)
means.append(sum(line_values)/len(line_values))
return points,values,means
def get_higher(img):
height,width = img.shape[:2]
gradient = 1.0*height/width
points = []
values = []
means = []
for j in range(0,height,1): # 0:479
line_points = []
line_values = []
for i in range(0,width,1): # 0:639
x = i #0:639
y = int(i*gradient) + j
if y < height and x*y >= 0:
line_points.append([y,width-1-x])
line_values.append(img[y][width-1-x])
line_points.reverse()
line_values.reverse()
points.append(line_points)
values.append(line_values)
means.append(sum(line_values)/len(line_values))
points.reverse()
values.reverse()
means.reverse()
return points,values, means
points_lower_frequence,values_lower_frequence,means_lower_frequence = get_lower(img)
points_higher_frequence,values_higher_frequence,means_higher_frequence = get_higher(img)
points_higher_frequence.pop()
values_higher_frequence.pop()
means_higher_frequence.pop()
points = points_higher_frequence + points_lower_frequence
values = values_higher_frequence + values_lower_frequence
means = means_higher_frequence + means_lower_frequence
points.reverse()
values.reverse()
means.reverse()
idx = 1
for P in points:
if not (idx % 2) :
P.reverse()
idx += 1
idx = 1
for P in values:
if not (idx % 2) :
P.reverse()
idx += 1
return points, values, means
def deZigZag(original_img,zigzaged_points,zigzaged_values):
new_img = np.zeros(original_img.shape,dtype=original_img.dtype)
for i in range(len(zigzaged_values)):
for j in range(len(zigzaged_values[i])):
new_img[zigzaged_points[i][j][0],zigzaged_points[i][j][1]] = zigzaged_values[i][j]
return new_img
if __name__ == '__main__':
try:
img_file = sys.argv[1]
img = cv2.imread(img_file,0)
except:
img = np.arange(6400,dtype=np.uint8).reshape(80,-1)
points,values,means = ZigZag(img)
for group in values:
print(group)
if len(sys.argv) == 1:
print("Usage: python gen_zigzag_from_any_img.py [img]")