做曖視頻網(wǎng)站大全什么平臺(tái)可以做引流推廣
前言
當(dāng)今數(shù)字時(shí)代,圖像處理和美化已經(jīng)變得非常普遍。從社交媒體到個(gè)人博客,人們都渴望分享獨(dú)特且引人注目的圖片。本文將介紹如何使用Python編程語(yǔ)言和OpenCV庫(kù)創(chuàng)建令人印象深刻的卡通風(fēng)格圖像??ㄍL(fēng)格的圖像具有藝術(shù)性和創(chuàng)意,它們可以用于圖像編輯、創(chuàng)意表達(dá)以及增加娛樂(lè)價(jià)值。
文章目錄
- 前言
- 1. 準(zhǔn)備工作
- 2. 讀取和顯示圖像
- 3. 創(chuàng)建邊緣掩膜
- 4. 顏色量化
- 5. 圖像處理和效果增強(qiáng)
- 6. 完整代碼
- 總結(jié)
1. 準(zhǔn)備工作
在開始之前,您需要安裝以下必要的庫(kù):
- OpenCV (cv2)
- NumPy
如果您還沒(méi)有安裝這些庫(kù),可以使用pip進(jìn)行安裝。
pip install opencv-python numpy
2. 讀取和顯示圖像
首先,我們將介紹如何使用OpenCV讀取圖像文件并在窗口中顯示它們。這是我們處理圖像的第一步。
# 讀取文件
def read_file(filename: str) -> np.ndarray:try:img = cv2.imread(filename)if img is None:raise ValueError("Invalid file path or file format.")return imgexcept:raise ValueError("Invalid file path or file format.")# 顯示圖片
def display_image(img: np.ndarray, window_name: str) -> None:cv2.imshow(window_name, img)cv2.waitKey()
在這個(gè)步驟中,我們定義了一個(gè)名為read_file的函數(shù),它接受一個(gè)文件名作為參數(shù),并返回一個(gè)NumPy數(shù)組表示的圖像。如果文件路徑無(wú)效或圖像格式不受支持,函數(shù)將引發(fā)異常。
我們定義了一個(gè)名為display_image的函數(shù),它接受兩個(gè)參數(shù):要顯示的圖像和窗口的名稱。函數(shù)將圖像顯示在指定的窗口中,并等待用戶按下任意鍵后關(guān)閉窗口。這個(gè)簡(jiǎn)單的步驟允許我們?cè)谶M(jìn)行后續(xù)處理之前,查看原始照片的外觀。
3. 創(chuàng)建邊緣掩膜
接下來(lái),我們將圖像轉(zhuǎn)化為卡通風(fēng)格的第一步是創(chuàng)建邊緣掩膜。我們將使用邊緣檢測(cè)技術(shù)來(lái)實(shí)現(xiàn)這一目標(biāo)。
# 邊緣掩膜
def edge_mask(image: np.ndarray, line_size: int, blur_value: int) -> np.ndarray:if not isinstance(line_size, int) or not isinstance(blur_value, int) or line_size < 1 or blur_value < 1:raise ValueError("Invalid value for 'line_size' or 'blur_value' parameter. Must be a positive integer.")gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray_blur = cv2.medianBlur(gray, blur_value)edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)return edges
在這個(gè)步驟中,我們定義了一個(gè)名為edge_mask的函數(shù),它接受三個(gè)參數(shù):圖像、線條大小(控制邊緣粗細(xì))和模糊程度。函數(shù)將圖像轉(zhuǎn)換為灰度圖,然后應(yīng)用中值模糊和自適應(yīng)閾值處理,以創(chuàng)建邊緣掩膜。
4. 顏色量化
卡通風(fēng)格的圖像通常具有較少的顏色。我們將使用K-Means聚類算法來(lái)減少圖像中的顏色數(shù)量。
# 顏色量化
def color_quantization(image: np.ndarray, num_colors: int) -> np.ndarray:if not isinstance(num_colors, int) or num_colors < 1:raise ValueError("Invalid value for 'num_colors' parameter. Must be a positive integer.")# 轉(zhuǎn)換圖片data = np.float32(image).reshape((-1, 3))# 設(shè)置KMeans聚類參數(shù)kmeans_criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)flags = cv2.KMEANS_RANDOM_CENTERS# 執(zhí)行KMeans聚類_, labels, centers = cv2.kmeans(data, num_colors, None, kmeans_criteria, 10, flags)centers = np.uint8(centers)processed_image = centers[labels.flatten()]processed_image = processed_image.reshape(image.shape)# 應(yīng)用顏色增強(qiáng)hsv_image = cv2.cvtColor(processed_image, cv2.COLOR_BGR2HSV)hsv_image[:, :, 1] = hsv_image[:, :, 1] * 1.5 # 增強(qiáng)飽和度enhanced_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)return enhanced_image
在這個(gè)步驟中,我們定義了一個(gè)名為color_quantization的函數(shù),它接受兩個(gè)參數(shù):圖像和要使用的顏色數(shù)量。函數(shù)首先將圖像轉(zhuǎn)換為數(shù)據(jù)矩陣,然后使用K-Means聚類算法將圖像顏色量化為指定數(shù)量的顏色。最后,我們?cè)鰪?qiáng)了圖像的飽和度,以使顏色更加生動(dòng)。
5. 圖像處理和效果增強(qiáng)
在這一步驟中,我們將應(yīng)用一些圖像處理技術(shù),如雙邊濾波,以增強(qiáng)最終的卡通效果圖像。
def resize_crop(image):h, w, c = np.shape(image)if min(h, w) > 720:if h > w:h, w = int(720 * h / w), 720else:h, w = 720, int(720 * w / h)image = cv2.resize(image, (w, h), interpolation=cv2.INTER_AREA)h, w = (h // 8) * 8, (w // 8) * 8image = image[:h, :w, :]return image# 圖像處理和效果增強(qiáng)
def cartoonize(load_folder, save_folder):name_list = os.listdir(load_folder)for name in name_list:try:load_path = os.path.join(load_folder, name)save_path = os.path.join(save_folder, name)if not save_path.endswith('.jpg'):raise ValueError("Invalid file format. Must be a '.jpg' file.")image = cv2.imread(load_path)image = resize_crop(image)display_image(image, "Image")# 設(shè)置邊緣掩膜參數(shù)并應(yīng)用line_size = 7blur_value = 7edges = edge_mask(image, line_size, blur_value)display_image(edges, "Edges")# 執(zhí)行顏色量化num_colors = 9processed_image = color_quantization(image, num_colors)display_image(processed_image, "Processed_image")# 應(yīng)用雙邊濾波blurred = cv2.bilateralFilter(processed_image, d=9, sigmaColor=200, sigmaSpace=200)display_image(blurred, "Blurred")# 應(yīng)用掩膜cartoonized_image = cv2.bitwise_and(blurred, blurred, mask=edges)display_image(cartoonized_image, "Cartoonized Image")cv2.imwrite(save_path, cartoonized_image)except:print('cartoonize {} failed'.format(load_path))
在這個(gè)步驟中,我們首先調(diào)整圖像的大小和裁剪,以確保它符合處理的要求。然后,我們依次應(yīng)用邊緣掩膜、顏色量化、雙邊濾波和最后的掩膜應(yīng)用,將圖像轉(zhuǎn)換成卡通畫風(fēng)。
這是整個(gè)卡通化過(guò)程的關(guān)鍵部分,通過(guò)這些步驟,您可以將任何普通照片轉(zhuǎn)換成具有卡通風(fēng)格的藝術(shù)品。在接下來(lái)的文章中,我們將展示如何使用這些代碼來(lái)卡通化您自己的照片。
6. 完整代碼
# -*- coding = utf-8 -*-
"""
# @Time : 2023/9/22 20:18
# @Author : FriK_log_ff 374591069
# @File : newmyway.py
# @Software: PyCharm
# @Function: 請(qǐng)輸入項(xiàng)目功能
"""
import cv2
import numpy as np
import os# 讀取文件
def read_file(filename: str) -> np.ndarray:try:img = cv2.imread(filename)if img is None:raise ValueError("Invalid file path or file format.")return imgexcept:raise ValueError("Invalid file path or file format.")# 顯示圖片
def display_image(img: np.ndarray, window_name: str) -> None:cv2.imshow(window_name, img)cv2.waitKey()# 邊緣掩膜
def edge_mask(image: np.ndarray, line_size: int, blur_value: int) -> np.ndarray:if not isinstance(line_size, int) or not isinstance(blur_value, int) or line_size < 1 or blur_value < 1:raise ValueError("Invalid value for 'line_size' or 'blur_value' parameter. Must be a positive integer.")gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray_blur = cv2.medianBlur(gray, blur_value)edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)return edges# 顏色量化
def color_quantization(image: np.ndarray, num_colors: int) -> np.ndarray:if not isinstance(num_colors, int) or num_colors < 1:raise ValueError("Invalid value for 'num_colors' parameter. Must be a positive integer.")# 轉(zhuǎn)換圖片data = np.float32(image).reshape((-1, 3))# 設(shè)置KMeans聚類參數(shù)kmeans_criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)flags = cv2.KMEANS_RANDOM_CENTERS# 執(zhí)行KMeans聚類_, labels, centers = cv2.kmeans(data, num_colors, None, kmeans_criteria, 10, flags)centers = np.uint8(centers)processed_image = centers[labels.flatten()]processed_image = processed_image.reshape(image.shape)# 應(yīng)用顏色增強(qiáng)hsv_image = cv2.cvtColor(processed_image, cv2.COLOR_BGR2HSV)hsv_image[:, :, 1] = hsv_image[:, :, 1] * 1.5 # 增強(qiáng)飽和度enhanced_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)return enhanced_imagedef resize_crop(image):h, w, c = np.shape(image)if min(h, w) > 720:if h > w:h, w = int(720 * h / w), 720else:h, w = 720, int(720 * w / h)image = cv2.resize(image, (w, h), interpolation=cv2.INTER_AREA)h, w = (h // 8) * 8, (w // 8) * 8image = image[:h, :w, :]return image# 上傳文件
def cartoonize(load_folder, save_folder):name_list = os.listdir(load_folder)for name in name_list:try:load_path = os.path.join(load_folder, name)save_path = os.path.join(save_folder, name)if not save_path.endswith('.jpg'):raise ValueError("Invalid file format. Must be a '.jpg' file.")image = cv2.imread(load_path)image = resize_crop(image)display_image(image, "Image")# 設(shè)置邊緣掩膜參數(shù)并應(yīng)用line_size = 7blur_value = 7edges = edge_mask(image, line_size, blur_value)display_image(edges, "Edges")# 執(zhí)行顏色量化num_colors = 9processed_image = color_quantization(image, num_colors)display_image(processed_image, "Processed_image")# 應(yīng)用雙邊濾波blurred = cv2.bilateralFilter(processed_image, d=9, sigmaColor=200, sigmaSpace=200)display_image(blurred, "Blurred")# 應(yīng)用掩膜cartoonized_image = cv2.bitwise_and(blurred, blurred, mask=edges)display_image(cartoonized_image, "Cartoonized Image")cv2.imwrite(save_path, cartoonized_image)except:print('cartoonize {} failed'.format(load_path))if __name__ == '__main__':load_folder = 'test_images'save_folder = 'cartoonized_images'if not os.path.exists(save_folder):os.mkdir(save_folder)cartoonize(load_folder, save_folder)
總結(jié)
在本文中,我們探討了如何使用Python和OpenCV庫(kù)創(chuàng)建卡通風(fēng)格的圖像。通過(guò)一系列圖像處理步驟,我們將普通照片轉(zhuǎn)化為有趣和具有創(chuàng)意的卡通風(fēng)格圖像。這個(gè)過(guò)程涵蓋了圖像讀取、邊緣檢測(cè)、顏色量化、圖像處理和效果增強(qiáng)等關(guān)鍵步驟。
卡通風(fēng)格圖像的制作涉及多個(gè)步驟,但通過(guò)掌握這些技巧,您可以自由發(fā)揮創(chuàng)造力,為照片增添新的趣味性。以下是本文中使用的一些關(guān)鍵技術(shù)的簡(jiǎn)要回顧:
-
圖像讀取和顯示: 我們使用OpenCV庫(kù)來(lái)讀取圖像文件并在窗口中顯示它們。這是開始圖像處理的第一步。
-
邊緣掩膜: 為了創(chuàng)建卡通風(fēng)格,我們使用了邊緣檢測(cè)技術(shù),將圖像中的邊緣突出顯示。
-
顏色量化: 卡通圖像通常包含較少的顏色。我們使用K-Means聚類來(lái)減少圖像中的顏色數(shù)量,從而實(shí)現(xiàn)卡通風(fēng)格的色彩。
-
圖像處理和效果增強(qiáng): 我們應(yīng)用了一些圖像處理技術(shù),例如雙邊濾波,以增強(qiáng)最終的卡通效果圖像。
在完成所有處理步驟后,我們得到了有趣和獨(dú)特的卡通風(fēng)格圖像。這個(gè)過(guò)程可以批量處理圖像,使您能夠輕松創(chuàng)建多個(gè)卡通化的照片。
希望本文對(duì)您有所幫助,能夠啟發(fā)您探索更多有趣的圖像處理項(xiàng)目。 創(chuàng)造自己獨(dú)特的卡通風(fēng)格圖像,讓您的照片在社交媒體和網(wǎng)絡(luò)上脫穎而出。