使用opencv可以使用以下5个步骤创建卡通效果
1、应用双边滤镜以减少图像的调色板。
2、将原始彩色图像转换为灰度。
3、应用中间模糊,以减少灰度图像中的图像噪声。
4、使用自适应阈值从灰度图像创建边缘蒙版。
5、将步骤1中的彩色图像与步骤4中的边缘遮罩合并。
步骤一、由于双边滤镜可以平滑平面区域,同时保持边缘清晰,因此非常适合将RGB图像转换为卡通图像。但是双边滤波器比其他平滑算子(例如,高斯模糊)要慢几个数量级。因此,如果速度很重要,那么对原始图像的缩小版本进行操作可能是一个好主意。即使缩小规模,双边过滤器仍然可能比他的算法慢。因此,另一个技巧是重复(例如,通过num_bilateral = 7七次)应用一个小的双边过滤器,而不是一次应用一个大的双边过滤器。但是实际上这个速度一般都可以接受的
import cv2num_down = 2
stepsnum_bilateral = 7
steps img_rgb = cv2.imread("img_example.jpg")
img_color = img_rgbfor _ in xrange(num_down):
img_color = cv2.pyrDown(img_color)
for _ in xrange(num_bilateral):
img_color = cv2.bilateralFilter(img_color, d=9,sigmaColor=9,sigmaSpace=7)
for _ in xrange(num_down):
img_color = cv2.pyrUp(img_color)
步骤2-3:使用中值滤波器降低噪声
自适应阈值的优点在于,它可以检测图像的每个(小)邻域中最显着的特征,而与图像的整体属性无关,这正是我们想要在对象和对象周围绘制粗体,黑色轮廓时所需要的漫画中的人。但是,此属性也使自适应阈值容易受到噪声的影响。因此,最好使用中值滤波器对图像进行预处理,该滤波器将每个像素值替换为较小(例如7像素)邻域中所有像素的中值:
img_gray= cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
img_blur= cv2.medianBlur(img_gray,7)
步骤4:使用自适应阈值创建边缘遮罩
降噪后,可以安全地应用自适应阈值。即使剩下一些图像噪声,使用blockSize = 9的cv2.ADAPTIVE_THRESH_MEAN_C算法也将确保将阈值应用于9x9邻域平均值减去C = 2:
img_edge = cv2.adaptiveThreshold(img_blur,255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, blockSize=9, C=2)
步骤5:将彩色图像与边缘蒙版组合
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
img_cartoon = cv2.bitwise_and(img_color, img_edge)
cv2.imshow("cartoon", img_cartoon)
测试地址点滴图片在线转卡通工具
效果图

网友评论