Imports and Functions
Latest Page Update: 23-09-2026
Geometric transformations on images¶
The first topic is how to apply geometric transformations on images.
Let us start by defining a utility function, that can show two images side-by-side:
def show_comparison(original, transformed, transformed_name):
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(8, 4), sharex=True,
sharey=True)
ax1.imshow(original)
ax1.set_title('Original')
ax1.axis('off')
ax2.imshow(transformed)
ax2.set_title(transformed_name)
ax2.axis('off')
io.show()
also import some useful functions:
import matplotlib.pyplot as plt
import math
from skimage.transform import rotate
from skimage.transform import EuclideanTransform
from skimage.transform import SimilarityTransform
from skimage.transform import warp
from skimage.transform import swirl
Exercise script for transformation on video¶
For use in exercises on Video Transformations:
import time
import cv2
from skimage.transform import swirl
from skimage.transform import rotate
import math
def show_in_moved_window(win_name, img, x, y):
"""
Show an image in a window, where the position of the window can be given
"""
cv2.namedWindow(win_name)
cv2.moveWindow(win_name, x, y)
cv2.imshow(win_name, img)
def process_rgb_image(img, counter):
"""
Simple processing of a color (RGB) image
"""
return rotate(img, counter)
def capture_from_camera_and_show_images():
print("Starting image capture")
print("Opening connection to camera")
url = 0
use_droid_cam = False
if use_droid_cam:
url = "http://192.168.1.120:4747/video"
cap = cv2.VideoCapture(url)
if not cap.isOpened():
print("Cannot open camera")
exit()
print("Starting camera loop")
# To keep track of frames per second using a high-performance counter
old_time = time.perf_counter()
fps = 0
stop = False
counter = 0
while not stop:
ret, new_frame = cap.read()
if not ret:
print("Can't receive frame. Exiting ...")
break
# Change from OpenCV BGR to scikit image RGB
new_image = new_frame[:, :, ::-1]
proc_time_start = time.perf_counter()
proc_img = process_rgb_image(new_image, counter)
proc_time = time.perf_counter() - proc_time_start
# convert back to OpenCV BGR to show it
proc_img = proc_img[:, :, ::-1]
counter = counter + 1
# update FPS - but do it slowly to avoid fast changing number
new_time = time.perf_counter()
time_dif = new_time - old_time
old_time = new_time
fps = fps * 0.95 + 0.05 * 1 / time_dif
# Put the FPS on the new_frame
str_out = f"fps: {int(fps)} proc.time: {int(proc_time * 1000)} ms"
font = cv2.FONT_HERSHEY_COMPLEX
cv2.putText(new_frame, str_out, (100, 100), font, 1, 255, 1)
# Display the resulting frame
show_in_moved_window('Input', new_frame, 0, 10)
show_in_moved_window('Processed image', proc_img, 1200, 10)
if cv2.waitKey(1) == ord('q'):
stop = True
print("Stopping image loop")
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
capture_from_camera_and_show_images()