"""simple docstring"""







from pathlib import Path

import cva
import numpy as np
from matplotlib import pyplot as plt


def      __lowerCAmelCase(		__UpperCAmelCase     ,__UpperCAmelCase     ,__UpperCAmelCase     ,__UpperCAmelCase     ,__UpperCAmelCase			):






	"""simple docstring"""





	_lowercase :    Any							=							cva.getAffineTransform(lowercase_     ,lowercase_			)
	return cva.warpAffine(lowercase_     ,lowercase_     ,(rows, cols)			)


if __name__ == "__main__":
				# read original image
				SCREAMING_SNAKE_CASE									=						cva.imread(
				    str(Path(__file__).resolve().parent.parent / 'image_data' / 'lena.jpg')
				)
				# turn image in gray scale value
				SCREAMING_SNAKE_CASE									=						cva.cvtColor(image, cva.COLOR_BGR2GRAY)
				# get image shape
				SCREAMING_SNAKE_CASE									=						gray_img.shape

				# set different points to rotate image
				SCREAMING_SNAKE_CASE									=						np.array([[50, 50], [200, 50], [50, 200]], np.floataa)
				SCREAMING_SNAKE_CASE									=						np.array([[10, 100], [200, 50], [100, 250]], np.floataa)
				SCREAMING_SNAKE_CASE									=						np.array([[50, 50], [150, 50], [120, 200]], np.floataa)
				SCREAMING_SNAKE_CASE									=						np.array([[10, 100], [80, 50], [180, 250]], np.floataa)

				# add all rotated images in a list
				SCREAMING_SNAKE_CASE									=						[
				    gray_img,
				    get_rotation(gray_img, ptsa, ptsa, img_rows, img_cols),
				    get_rotation(gray_img, ptsa, ptsa, img_rows, img_cols),
				    get_rotation(gray_img, ptsa, ptsa, img_rows, img_cols),
				]

				# plot different image rotations
				SCREAMING_SNAKE_CASE									=						plt.figure(1)
				SCREAMING_SNAKE_CASE									=						['Original', 'Rotation 1', 'Rotation 2', 'Rotation 3']
				for i, image in enumerate(images):
								plt.subplot(2, 2, i + 1), plt.imshow(image, 'gray')
								plt.title(titles[i])
								plt.axis('off')
								plt.subplots_adjust(left=0.0, bottom=0.05, right=1.0, top=0.95)
				plt.show()




"""simple docstring"""







import math


def      __lowerCAmelCase(		__UpperCAmelCase			):






	"""simple docstring"""





	if not isinstance(__UpperCAmelCase     ,__UpperCAmelCase			):
		_lowercase :    List[Any]							=							F'''Input value of [number={number}] must be an integer'''
		raise TypeError(__UpperCAmelCase			)

	if number < 1:
		_lowercase :    List[Any]							=							F'''Input value of [number={number}] must be > 0'''
		raise ValueError(__UpperCAmelCase			)
	elif number == 1:
		return 3
	elif number == 2:
		return 5
	else:
		_lowercase :    str							=							int(math.log(number // 3     ,2			)			) + 2

		_lowercase :    Union[str, Any]							=							[3, 5]
		_lowercase :    Optional[int]							=							2
		_lowercase :    List[Any]							=							3
		for block in range(1     ,__UpperCAmelCase			):
			for _ in range(__UpperCAmelCase			):
				proth_list.append(2 ** (block + 1) + proth_list[proth_index - 1]			)
				proth_index += 1
			increment *= 2

	return proth_list[number - 1]


if __name__ == "__main__":
						import doctest

						doctest.testmod()

						for number in range(11):
												SCREAMING_SNAKE_CASE									=						0
												try:
																		SCREAMING_SNAKE_CASE									=						proth(number)
												except ValueError:
																		print(f"""ValueError: there is no {number}th Proth number""")
																		continue

												print(f"""The {number}th Proth number: {value}""")



