基于OpenCV的图像卡通化实现代码
本文介绍使用OpenCV实现图像卡通化的三种常见风格:铅笔素描、国画效果及抽象风格。通过高斯滤波、细节增强滤波器、双边滤波及拉普拉斯滤波器等工具,结合灰度处理、边缘检测与按位运算,生成具有艺术感的图像效果。
OpenCV全称为Open Source Computer Vision Library,是一个跨平台的开源计算机视觉库,支持Linux、Windows和Mac OS等操作系统。该库轻量且高效,由一系列C函数和少量C++类构成,同时提供Python、Ruby、MATLAB等语言的接口,实现了图像处理与计算机视觉领域的多项通用算法。
本文主要介绍基于OpenCV的图像卡通化实现,核心工具包括高斯滤波器、细节增强滤波器、双边滤波以及拉普拉斯滤波器。
铅笔素描效果
实现铅笔素描效果时,首先将输入图像转换为灰度图并进行高斯滤波。由于高斯滤波遵循正态分布,核尺寸越大,图像越模糊。最后一步是将原始灰度图像除以模糊后的灰度图像,从而计算两个图像中每个像素的变化率。模糊效果越强,像素值相对于原点的变化越大,从而使铅笔素描线条更加清晰。示例中第一幅图核数为25,第二幅图核数为75,体现了除法在此处的应用效果。


import cv2
img=cv2.imread('bird.jpg')
cv2.imshow('bird',img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Blur the image using Gaussian Blur
#高斯核服从正态分布,核数越大,越模糊
gray_blur = cv2.GaussianBlur(gray, (75, 75), 0)
# Convert the image into pencil sketch
cartoon = cv2.divide(gray, gray_blur, scale=250.0)
cv2.imshow('cartoon.jpg',cartoon)
cv2.waitKey()
cv2.destroyAllWindows()国画效果
国画效果的处理流程包括:锐化图像、平滑颜色以及增强边缘。具体步骤如下:1. 对原图像进行中值滤波后进行自适应均值滤波以检测边缘;2. 对原RGB图像使用细节增强滤波器进行锐化(若将细节增强滤波器替换为双边滤波,图像会显得更加平滑);3. 将锐化后的图像与边缘图像进行按位与操作,得到最终效果图。


import cv2
img=cv2.imread('bird.jpg')
cv2.imshow('bird',img)
#convert the image into grayscale image
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Blur the grayscale image with median blur中值滤波
gray_blur = cv2.medianBlur(gray, 3)
#Apply adaptive thresholding to detect edges检测图像边缘
edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 9, 9)#自适应均值滤波
#Sharpen the image锐化图像
color = cv2.detailEnhance(img, sigma_s=5, sigma_r=0.5)
cv2.imshow('color',color)
#细节增强函数 sigma_s控制着邻域的大小,该邻域的大小将被加权以替换图像中的像素值。值越高,邻域越大。这样可以使图像更平滑
#:如果要在平滑图像时保留边缘,这很重要。较小的值只会产生非常相似的颜色进行平均(即平滑),而相差很大的颜色将保持不变
#Merge the colors of same images using "edges" as a mask
cartoon = cv2.bitwise_and(color, color, mask=edges)
cv2.imshow('cartoon',cartoon)
cv2.waitKey()
cv2.destroyAllWindows()抽象效果
拉普拉斯滤波器通过利用对象内部的灰度级和图像背景强度来突出对象边缘。

import cv2
img=cv2.imread('bird.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img.jpg', img )
gray = cv2.medianBlur(gray, 3)
edges = cv2.Laplacian(gray, -1, ksize=5)
edges_inv = 255 - edges
dummy, cartoon = cv2.threshold(edges_inv, 0, 255, cv2.THRESH_BINARY)
cv2.imshow('cartoon.jpg', cartoon )
cv2.waitKey()
cv2.destroyAllWindows()至此,关于基于OpenCV的图像卡通化实现代码的介绍结束。更多相关Opencv图像卡通化内容可搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













