Наступний Python-скрипт можна використовувати для ідентифікації водяних знаків на зображеннях на основі кольору пікселів. Він перевіряє, чи перевищує відсоток пікселів, що відповідають заданому кольору, вказаний поріг.
Варіант OpenCV
watermark_detector_opencv.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import cv2
import sys
def parse_html_color(s):
s = s.lstrip('#')
if len(s) != 6:
raise ValueError("Колір має бути у форматі #RRGGBB")
return tuple(int(s[i:i+2], 16) for i in (0, 2, 4))
def fraction_color_pixels(image_path, target_rgb):
img = cv2.imread(image_path)
if img is None:
raise FileNotFoundError(f"Не вдалося відкрити зображення: {image_path}")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
mask = (img_rgb[:, :, 0] == target_rgb[0]) & \
(img_rgb[:, :, 1] == target_rgb[1]) & \
(img_rgb[:, :, 2] == target_rgb[2])
count = mask.sum()
total = img_rgb.shape[0] * img_rgb.shape[1]
return count / total if total > 0 else 0
def main():
parser = argparse.ArgumentParser(description="Обчислення частки пікселів заданого кольору на зображенні.")
parser.add_argument("image", help="Шлях до файлу зображення")
parser.add_argument("-t", "--threshold", type=float, default=0.05,
help="Поріг частки (за замовчуванням: 0.05 для 5%%)")
parser.add_argument("--color", default="#6f7918",
help="Рядок HTML-кольору для пошуку (за замовчуванням: #6f7918)")
args = parser.parse_args()
try:
target_rgb = parse_html_color(args.color)
except ValueError as e:
print(f"Недійсний колір: {e}")
sys.exit(2)
fraction = fraction_color_pixels(args.image, target_rgb)
print(fraction)
if fraction > args.threshold:
print("Поріг перевищено")
sys.exit(1)
else:
print("Нижче порогу")
sys.exit(0)
if __name__ == "__main__":
main()Варіант PIL (повільніший, не рекомендується)
watermark_detector_pil.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
from PIL import Image
import sys
def parse_html_color(s):
s = s.lstrip('#')
if len(s) != 6:
raise ValueError("Колір має бути у форматі #RRGGBB")
return tuple(int(s[i:i+2], 16) for i in (0, 2, 4))
def fraction_color_pixels(image_path, target_rgb):
img = Image.open(image_path).convert('RGB')
pixels = list(img.getdata())
total = len(pixels)
count = sum(1 for pixel in pixels if pixel == target_rgb)
return count / total if total > 0 else 0
def main():
parser = argparse.ArgumentParser(description="Обчислення частки пікселів заданого кольору на зображенні.")
parser.add_argument("image", help="Шлях до файлу зображення")
parser.add_argument("-t", "--threshold", type=float, default=0.05,
help="Поріг частки (за замовчуванням: 0.05 для 5%%)")
parser.add_argument("--color", default="#6f7918",
help="Рядок HTML-кольору для пошуку (за замовчуванням: #6f7918)")
args = parser.parse_args()
try:
target_rgb = parse_html_color(args.color)
except ValueError as e:
print(f"Недійсний колір: {e}")
sys.exit(2)
fraction = fraction_color_pixels(args.image, target_rgb)
print(fraction)
if fraction > args.threshold:
print("Поріг перевищено")
sys.exit(1)
else:
print("Нижче порогу")
sys.exit(0)
if __name__ == "__main__":
main()
Дивіться схожі статті за категоріями:
Python
Якщо ця стаття допомогла вам, будь ласка, подумайте про те, щоб купити мені каву або зробити пожертву через PayPal на підтримку досліджень та публікації нових статей на TechOverflow