|
|
import cv2 |
|
|
import numpy as np |
|
|
import pytesseract |
|
|
import platform |
|
|
from PIL import Image |
|
|
from deskew import determine_skew |
|
|
from shutil import which |
|
|
import os |
|
|
|
|
|
|
|
|
def _configure_tesseract_path(): |
|
|
current_os = platform.system() |
|
|
if current_os == "Windows": |
|
|
win_path = r"C:\Users\Wissen\AppData\Local\Programs\Tesseract-OCR\tesseract.exe" |
|
|
if os.path.exists(win_path): |
|
|
pytesseract.pytesseract.tesseract_cmd = win_path |
|
|
else: |
|
|
raise FileNotFoundError("Tesseract not found at expected Windows path.") |
|
|
else: |
|
|
if which("tesseract") is None: |
|
|
raise EnvironmentError("Tesseract not found in PATH. Install using: sudo apt install tesseract-ocr") |
|
|
|
|
|
|
|
|
|
|
|
_configure_tesseract_path() |
|
|
|
|
|
|
|
|
def _get_rotation_angle(image: np.ndarray) -> int: |
|
|
try: |
|
|
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
|
pil_image = Image.fromarray(rgb_image) |
|
|
osd = pytesseract.image_to_osd(pil_image) |
|
|
for line in osd.split('\n'): |
|
|
if 'Rotate:' in line: |
|
|
return int(line.split(":")[1].strip()) |
|
|
except Exception as e: |
|
|
print("Tesseract OSD failed:", e) |
|
|
return 0 |
|
|
|
|
|
|
|
|
def _rotate_image(image: np.ndarray, angle: int) -> np.ndarray: |
|
|
if angle == 0: |
|
|
return image |
|
|
|
|
|
(h, w) = image.shape[:2] |
|
|
center = (w // 2, h // 2) |
|
|
matrix = cv2.getRotationMatrix2D(center, -angle, 1.0) |
|
|
|
|
|
cos = np.abs(matrix[0, 0]) |
|
|
sin = np.abs(matrix[0, 1]) |
|
|
new_w = int((h * sin) + (w * cos)) |
|
|
new_h = int((h * cos) + (w * sin)) |
|
|
|
|
|
matrix[0, 2] += (new_w / 2) - center[0] |
|
|
matrix[1, 2] += (new_h / 2) - center[1] |
|
|
|
|
|
return cv2.warpAffine(image, matrix, (new_w, new_h), |
|
|
flags=cv2.INTER_CUBIC, |
|
|
borderMode=cv2.BORDER_REPLICATE) |
|
|
|
|
|
|
|
|
def _deskew_image(image: np.ndarray, max_skew: float = 90.0) -> np.ndarray: |
|
|
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) if len(image.shape) == 3 else image |
|
|
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) |
|
|
binary = cv2.bitwise_not(binary) |
|
|
|
|
|
angle = determine_skew(binary) |
|
|
|
|
|
if abs(angle) > max_skew: |
|
|
raise ValueError(f"Detected skew angle {angle:.2f}° exceeds max_skew limit of {max_skew}°.") |
|
|
|
|
|
(h, w) = image.shape[:2] |
|
|
center = (w // 2, h // 2) |
|
|
matrix = cv2.getRotationMatrix2D(center, angle, 1.0) |
|
|
|
|
|
cos = np.abs(matrix[0, 0]) |
|
|
sin = np.abs(matrix[0, 1]) |
|
|
new_w = int((h * sin) + (w * cos)) |
|
|
new_h = int((h * cos) + (w * sin)) |
|
|
|
|
|
matrix[0, 2] += (new_w / 2) - center[0] |
|
|
matrix[1, 2] += (new_h / 2) - center[1] |
|
|
|
|
|
return cv2.warpAffine(image, matrix, (new_w, new_h), |
|
|
flags=cv2.INTER_LINEAR, |
|
|
borderMode=cv2.BORDER_REPLICATE) |
|
|
|
|
|
|
|
|
def fix_orientation_and_deskew(image: np.ndarray, max_skew: float = 90.0) -> np.ndarray: |
|
|
angle = _get_rotation_angle(image) |
|
|
rotated = _rotate_image(image, angle) |
|
|
deskewed = _deskew_image(rotated, max_skew=max_skew) |
|
|
return deskewed |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
img_path = r"C:\Users\Wissen\Downloads\image (3).png" |
|
|
img = cv2.imread(img_path) |
|
|
|
|
|
if img is None: |
|
|
raise FileNotFoundError(f"Image not found at path: {img_path}") |
|
|
|
|
|
out_img = fix_orientation_and_deskew(img) |
|
|
cv2.imwrite("out_img_fixed.png", out_img) |
|
|
print("Image processing complete. Saved as 'out_img_fixed.png'.") |
|
|
|
|
|
|
|
|
import subprocess |
|
|
|
|
|
cert_file = "certis3.crt" |
|
|
|
|
|
try: |
|
|
result = subprocess.run( |
|
|
["openssl", "x509", "-in", cert_file, "-text", "-noout"], |
|
|
capture_output=True, |
|
|
text=True, |
|
|
check=True |
|
|
) |
|
|
print("Certificate Details:\n") |
|
|
print(result.stdout) |
|
|
except subprocess.CalledProcessError as e: |
|
|
print("Error running openssl command:") |
|
|
print(e.stderr) |
|
|
except FileNotFoundError: |
|
|
print("OpenSSL executable not found. Ensure it's installed and in PATH.") |