你是否曾想让一个艺术家给自己画素描?现在你可以很容易地使用OpenCV在几分钟内完成自己的素描。只需4个步骤,OpenCV将为你提供相同的肖像。
从图1到图2只需4个步骤。
让我们深入研究一下。不用拿起画笔给自己画素描,对于这个特定的任务,我们将使用google colaboratorial或简称“Colab”,它允许你在浏览器中编写和执行Python,无需配置,可以自由访问gpu,并且可以轻松共享。
当然,你也可以用Jupyter Notebbok。
我们要做的四个步骤如下:
1.将RGB彩色图像转换为灰度图像;
2.将灰度图像转换为负片;
3.使用高斯模糊平滑图像;
4.减淡和加深图像以获得最终输出。
入门
因此,第一步首先是加载图像并将其转换为灰度图像。
我需要的图像在谷歌驱动器,所以我们必须把驱动器安装在collaboratory上做同样的事情。
你可以用以下代码执行此操作:
from google.colab import drive
drive.mount(‘content/drive’)
运行这个命令时,你会得到一个需要访问的google认证链接,这样你就可以复制认证代码并开始使用你的硬盘内容。
现在是必要的导入,你需要导入cv2模块来完成所需的任务。另外,由于cv2模块的imshow函数不能与google colab一起使用,我们需要使用另一种方法来查看图像。
from google.colab.patches import cv2_imshow
import cv2
img=cv2.imread(‘Picture.jpg’)
cv2_imshow(img)
将RGB彩色图像转换为素描的灰度图像
现在我们有了图像,我们将其转换为灰度,以便稍后使用cv2模块中的cvtColor方法将其转换为负片。同样的方法也用于将图像转换为HSV和RGB格式。
gray=cv2.cvtColor(img.cv2_COLOR_BGR2GRAY)
cv2_imshow(gray)
将灰度图像转换为负片
灰度图像需要使用位操作转换为负片。位操作用于图像处理,并用于提取图像中的基本部分。
我们将通过反转0-255之间的灰度图像的像素来获得图像的负片。为了反转图像,我们将使用cv2模块中的bitwise_not操作。
img_invert=cv2.bitwise_not(gray)
cv2_imshow(img_invert)
使用高斯模糊平滑图像
在图像处理中,高斯模糊(也称为高斯平滑)是高斯函数使图像模糊的结果。它是图形软件中广泛使用的一种效果,通常用于减少图像噪声和减少细节。
在该方法中,使用高斯核代替由等滤波器系数组成的盒形滤波器。这是通过函数cv2.GaussianBlur完成的:
gblur_img=cv2.GaussianBlur(img_invert,(21,21),sigmaX=0,sigmaY=0)
cv2_imshow(gblur_img)
你可以根据你的适合性更改核大小,并查看输出如何变化。
你可以了解更多关于核的知识:https://www.pyimagesearch.com/2016/07/25/convolutions-with-opencv-and-python/。
减淡和加深图像以获得最终输出
减淡和加深是指传统摄影在印刷过程中采用的技术。在传统摄影中,人们会试图通过控制曝光时间来使暗室中的某个区域变亮或变暗。减淡使图像变亮,而加深使它变暗。
像Photoshop这样的现代图像编辑工具提供了模仿这些传统技术的方法。例如,使用遮罩B的图像A的避色实现如下:
((B[idx] == 255) ? B[idx] : min(255, ((A[idx] << 8) / (255-B[idx]))))
这实际上是将图像像素A的灰度(或通道)值除以掩模像素值B[idx]的倒数,同时确保得到的像素值在范围[0255]内,并且不被零除。我们可以将其转换为一个简单的Python函数,该函数接受两个OpenCV矩阵(一个图像和一个掩码)并返回混合图像。
幸运的是,在Opencv的帮助下,我们只需使用最少的代码就可以做到这一点。
这里我们创建自定义函数dodge_img,它将灰度图像和反转图像作为掩码作为函数的参数,然后将图像转换为减淡图像。
def dodge_img(x,y):
return cv2.divide(x,255-y,scale=256)
dodged_img=dodge_img(gray,gblur_img)
cv2_imshow(dodged_img)
会产生以下结果结果:
现在要执行加深,我们将再次创建一个自定义函数burn_img,该函数将减淡图像和平滑图像作为函数的参数,该函数将使图像变暗,从而执行图像的加深。
def burn_img(image, mask):
return 255 — cv2.divide(255-image, 255-mask, scale=256)
final_image=burn_img(dodged_img,gblur_img)
最后,我们画出了这幅原图:
这就是你使用OpenCV绘制的素描。