-
一、介绍 照片中的面部分析引起了人们的广泛关注,因为它可以帮助我们解决各种问题,包括更好的客户广告定位、更好的内容推荐系统、安全监控和其他领域。年龄和性别是面部特征的重要方面,确定它们是此类活动的先决条件。许多企业出于各种原因使用这些技术,包括更轻松地与客户合作、更好地适应他们的需求以及提供良好的体验。人们的性别和年龄使得识别和预测他们的需求变得更加容易。即使对我们人类来说,从图像中检测性别和年龄也很困难,因为它完全基于外表,有时很难预测,同龄人的外表可能与我们预期的截然不同。应用 在监控计算机视觉中,经常使用年龄和性别预测。计算机视觉的进步使这一预测变得更加实用,更容易为公众所接受。由于其在智能现实世界应用中的实用性,该研究课题取得了重大进展。一个人的身份、年龄、性别、情绪和种族都是由他们脸上的特征决定的。年龄和性别分类是其中的两个特征,在各种实际应用中特别有用,包括安全和视频监控人机交互生物识别技术娱乐还有很多。实施 现在让我们学习如何使用 Python 中的 OpenCV 库通过相机或图片输入来确定年龄和性别。使用的框架是 Caffe,用于使用原型文件创建模型。让我们开始吧,如果我们还没有安装 OpenCV,请确保已经安装了它。pip install opencv-python numpy第 1 步:导入库 Import required modules import cv2 as cv import math import time from google.colab.patches import cv2_imshow第 2 步:在框架中查找边界框坐标使用下面的用户定义函数,我们可以获得边界框的坐标,也可以说人脸在图像中的位置。def getFaceBox(net, frame, conf_threshold=0.7): frameOpencvDnn = frame.copy() frameHeight = frameOpencvDnn.shape[0] frameWidth = frameOpencvDnn.shape[1] blob = cv.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False) net.setInput(blob) detections = net.forward() bboxes = [] for i in range(detections.shape[2]): confidence = detections[0, 0, i, 2] if confidence > conf_threshold: x1 = int(detections[0, 0, i, 3] * frameWidth) y1 = int(detections[0, 0, i, 4] * frameHeight) x2 = int(detections[0, 0, i, 5] * frameWidth) y2 = int(detections[0, 0, i, 6] * frameHeight) bboxes.append([x1, y1, x2, y2]) cv.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8) return frameOpencvDnn, bboxes
-
通常,数据科学家会建立一个图像识别模型,观察其准确性,如果足够高,就表示工作完成了。然而,自从我开始学习机器学习,我就一直不明白这一点,为什么要花费所有的时间来建立最好的模型——只是为了满足于一个数字? 在本文中,将提供代码并指导你如何通过构建与模型交互的拍照接口来真正完成项目。 安装cv2(OpenCV) 我们将使用的图像库是cv2。因为cv2不能在Kaggle这样的在线平台上工作,所以它必须在你的计算机上本地完成。然而,模型的权重仍然可以在Kaggle上进行训练,以.h5文件的形式下载(基于Keras/TensorFlow)并加载。 在Anaconda或命令提示符中键入 conda create -n opencv python=3.6这将在Python版本3.6中创建一个名为opencv的新环境,可以用正在使用的任何版本替换它。下一步,输入pip install opencv-python你已经成功安装了cv2! 现在你可以开始拍照了。 用cv2拍照 首先,导入库。 import cv2接下来,我们必须创建一个视频捕获实例。你可以测试实例是否能够连接到你的相机(如果没有,请检查你的设置以确保应用程序可以访问它)。cap = cv2.VideoCapture(0) if not (cap.isOpened()): print("Video device not connected.")最后,是时候拍照了。如果要控制拍摄照片的时间,第一行将指定任意变量和输入。除非输入了某些内容(如按“回车”),然后下一行开始拍照,否则程序无法继续。拍摄图像时,你可能会看到网络摄像头指示灯很快出现。第三行关闭连接,第四行销毁访问相机的所有实例。arb = input('Press enter to take picture.') ret, frame = cap.read() cap.release() cv2.destroyAllWindows()图像中的数据存储在frame中。可以使用以下代码将其转换为数组:cv2_im = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)调用cv2_im.shape时,输出为(480640,3)。因此,图像(对于我的相机)是480×640像素(3表示“深度”, 每个像素中有三个值说明创建最终像素颜色需要包含红色、绿色和蓝色)。现在图像已转换为数组,matplotlib的imshow()可以显示它。import matplotlib.pyplot as plt plt.imshow(cv2_im) plt.show()完整代码:import cv2 import matplotlib.pyplot as plt cap = cv2.VideoCapture(10) if not (cap.isOpened()): print("Video device unconnected.") arb = input('Press enter to take picture.') ret, frame = cap.read() cap.release() cv2.destroyAllWindows() cv2_im = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) plt.imshow(cv2_im) plt.show()
-
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:1、研究代码(慢,不稳定,独立并与其他库不兼容)2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。图1为OpenCV与当前其他主流视觉函数库的性能比较。
-
使用 OpenCV 的虚拟键盘主程序重要的部分来了。 while True: success, img = cap.read() img = detector.findHands(img) lmList, bboxInfo = detector.findPosition(img) img = draw(img, buttonList) # change the draw funtion to transparent_layout for transparent keys if lmList: for button in buttonList: x, y = button.pos w, h = button.size if x < lmList[8][0]<x+w and y < lmList[8][1] < y+h: cv2.rectangle(img, button.pos, (x + w, y + h), (0, 255, 255), cv2.FILLED) cv2.putText(img, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) l, _, _ = detector.findDistance(8,12, img, draw=False) print(l) if l < 25: keyboard.press(button.text) cv2.rectangle(img, button.pos, (x + w, y + h), (0, 255, 0), cv2.FILLED) cv2.putText(img, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) final_text += button.text sleep(0.20) cv2.rectangle(img, (25,350), (700, 450), (255, 255, 255), cv2.FILLED) cv2.putText(img, final_text, (60, 425), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) # cv2.rectangle(img, (100,100), (200,200), # (100, 255, 0), cv2.FILLED) # cv2.putText(img, 'Q', (120,180), cv2.FONT_HERSHEY_PLAIN, 5, # (0, 0, 0), 5) # img = mybutton.draw(img) cv2.imshow("output", img) cv2.waitKey(1)在 while 循环中,首先我们读取实时输入帧并将其存储在一个名为img的变量中。然后我们将该图像传递给*检测器.findHands()*以便在帧中找到手。然后在该图像中,我们需要找到检测到的手的位置和边界框信息。 在这里我们可以找到我们的食指和中指的顶点之间的距离,如果两者之间的距离小于某个阈值,那么我们就可以输入我们所指示的字母。 一旦我们获得了位置,我们就会遍历整个位置列表。从该列表中,我们找到按钮位置和按钮大小,然后根据明确定义的方式将其绘制在框架上。 之后,我们需要找到食指和中指的顶点之间的距离。在上图中,你可以看到我们需要的最高点是点 8 和点 12。因此,我们需要在距离查找函数中传递 8, 12 以获得它们之间的距离。 在上面的代码中,你可以看到 detector.findDistance(),我们通过了 8、12 和图像来查找距离,并将绘制标志设置为 false,这样我们就不需要两点之间的任何线。 如果点之间的距离非常小,我们将使用 press() 函数来按下按键。在上面的代码keyboard.press() 中,我们传递button.text以显示按下的键。最后,我们在键盘布局下方绘制一个小的白色矩形框,以显示按下的键。 一旦你执行了整个代码,它看起来像这样。 将食指和中指靠近特定字母的顶部后,你可以键入该字母 如果你需要更自定义的键盘布局,我们可以使键盘布局透明。我们只需要添加一个透明布局函数并将*draw()函数替换为transparent_layout()*函数即可。 让我们定义transparent_layout()函数。下面是函数的代码,它采用与draw()函数相同的输入。在这里,我们将 numpy 的zero_like()函数分配给 名为imgNew的变量,并对其执行所需的操作,例如获得角矩形、为每个键创建矩形框并将文本放入框内。之后,我们将该图像复制到一个新变量并创建一个imgNew掩码,然后我们使用 OpenCV 的*addWeighted()*函数将掩码放置在实际图像的顶部。因此,这使键盘布局透明。自定义键盘def transparent_layout(img, buttonList): imgNew = np.zeros_like(img, np.uint8) for button in buttonList: x, y = button.pos cvzone.cornerRect(imgNew, (button.pos[0], button.pos[1], button.size[0],button.size[0]), 20 ,rt=0) cv2.rectangle(imgNew, button.pos, (x + button.size[0], y + button.size[1]), (255, 144, 30), cv2.FILLED) cv2.putText(imgNew, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) out = img.copy() alpaha = 0.5 mask = imgNew.astype(bool) print(mask.shape) out[mask] = cv2.addWeighted(img, alpaha, imgNew, 1-alpaha, 0)[mask] return out一旦将while 循环中的*draw()函数替换为transparent_layout()*函数,它将如下所示。(下图)
-
介绍OpenCV 是最流行的计算机视觉任务库,它是用于机器学习、图像处理等的跨平台开源库,用于开发实时计算机视觉应用程序。 CVzone 是一个计算机视觉包,它使用 OpenCV 和 Media Pipe 库作为其核心,使我们易于运行,例如手部跟踪、人脸检测、面部标志检测、姿势估计等,以及图像处理和其他计算机视觉相关的应用程序。使用 OpenCV 实现虚拟键盘让我们创建一个虚拟键盘。 首先,让我们安装所需的模块。 pip install numpy pip install opencv-python pip install cvzone pip install pynput使用 OpenCV 为虚拟键盘导入库现在让我们导入所需的模块 import cv2 import cvzone from cvzone.HandTrackingModule import HandDetector from time import sleep import numpy as np from pynput.keyboard import Controller这里我们从 cvzone.HandTrackingModule 导入 HandDetector 模块,然后为了使虚拟键盘工作,我们需要从 pynput.keyboard 导入Controller。 cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) cap.set(3, 1280) cap.set(4, 720)现在让我们从 cv2.Videocapture 获取实时输入 detector = HandDetector(detectionCon=0.8) keyboard_keys = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"], ["A", "S", "D", "F", "G", "H", "J", "K", "L", ";"], ["Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"]] final_text = ""我们以 0.8 的检测置信度初始化 HandDetector 并将其分配给检测器。 然后我们根据键盘的布局创建一个列表数组,并定义一个空字符串来存储键入的键。定义绘制函数keyboard = Controller() def draw(img, buttonList): for button in buttonList: x, y = button.pos w, h = button.size cvzone.cornerRect(img, (button.pos[0], button.pos[1], button.size[0],button.size[0]), 20 ,rt=0) cv2.rectangle(img, button.pos, (int(x + w), int(y + h)), (255, 144, 30), cv2.FILLED) cv2.putText(img, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) return img初始化键盘控制器,并定义一个名为draw()的函数,它接受两个参数,即图像和按钮列表并返回图像。在draw()函数内部,我们使用 cvzone 的cornerRect函数在每个键的角落绘制矩形边缘。这是为了让我们的键盘布局看起来更好看。就像下面的图片。 你也可以尝试更改不同的颜色。 class Button(): def __init__(self, pos, text, size=[85, 85]): self.pos = pos self.size = size self.text = text然后我们定义一个名为 Button() 的类,并提供位置、文本和大小作为输入,以便我们可以按照明确定义的顺序排列键盘按键。 buttonList = [] # mybutton = Button([100, 100], "Q") for k in range(len(keyboard_keys)): for x, key in enumerate(keyboard_keys[k]): buttonList.append(Button([100 * x + 25, 100 * k + 50], key))上面的循环将遍历键盘按键和 Button 对象,我们在其中给出位置和文本作为输入附加在一个名为 button list 的列表中。稍后我们可以将这个列表传递给 draw 函数以在我们的实时框架之上进行绘制。
-
既然,我们已经了解了手动祛痘的方法函数。下面,我们来实现手动的祛痘效果,具体代码如下所示:global img, point global inpaintMask #手动祛痘 def manual_acne(event, x, y, flags, param): global img, point img2 = img.copy() height, width, n = img.shape inpaintMask = np.zeros((height, width), dtype=np.uint8) if event == cv2.EVENT_LBUTTONDOWN: point = (x, y) cv2.circle(img2, point, 15, (0, 255, 0), -1) cv2.circle(inpaintMask, point, 15, 255, -1) cv2.imshow("image", img2) elif event == cv2.EVENT_LBUTTONUP: cv2.circle(img2, point, 15, (0, 255, 0), -1) cv2.circle(inpaintMask, point, 15, 255, -1) cv2.imshow("inpaintMask", inpaintMask) cv2.imshow("image", img2) cv2.imshow("image0", img) result = cv2.inpaint(img, inpaintMask, 100, cv2.INPAINT_TELEA) cv2.imshow("result", result) if __name__ == "__main__": global img img = cv2.imread("60.jpg") cv2.namedWindow("image") cv2.setMouseCallback("image", manual_acne) cv2.imshow("image", img) cv2.waitKey() cv2.destroyAllWindows() 复制代码运行之后,效果如下:作者:极客学编程链接:https://juejin.cn/post/6993690275180707870来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
人脸祛痘原理其实,在前面的人脸磨皮以及美白的时候,我们就已经完成了人脸的祛痘,只要高度磨皮(双边滤波)就能达到祛痘的效果。但是一般来说,现在的美图App都会给用户提供手动祛痘的功能,毕竟自动美白祛痘的效果再怎么好,都不可能完美的复原所有的人脸,那么额外的针对个人的修复就显得格外重要。其实人脸祛痘说白了,就是图像修复。而OpenCV中提供的修补函数为cv2.inpaint()。这里,我们先来看看改函数的定义:def inpaint(src, inpaintMask, inpaintRadius, flags, dst=None): 复制代码src:输入图像inpaintMask:修复掩膜inpaintRadius:需要修补的每个点的圆形领域为修复算法参考的半径flags:修复方法,两种取值。取值为INPAINT_NS基于Navier-Stokes的方法;INPAINT_TELEA基于Alexandru Telea。dst:返回修复后的图像该方法的原理是利用待修补区域的边缘信息,同时采用一种由粗到精的方法来估计等照度线的方法,并采用传播机制将信息传播到待修补的区域,以便达到较好的修补效果。翻译成人话就是:利用边缘的像素值,修补指定区域的像素。作者:极客学编程链接:https://juejin.cn/post/6993690275180707870来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
人脸美白原理人脸美白原理说透了,就是一种图像的颜色空间处理,所以我们需要通过颜色空间进行设计。不过,我们先来参考以下PS对于图像美白的处理步骤:首先,新建一个图层,将这个图层设置为白色接着,将白色图层与原本图像进行alpha通道的颜色混合,这样就可以使图像整体变白。通过PS的操作,我们大致可以知道需要创建一个与原图同等大小维度的图像,然后全部赋值为白色,然后通过图像图像加权和将两个图像叠加即可。不过,这里明显存在很多问题,在PS中,我们虽然创建了全白色的图层,但是我们可以剪裁或者使用画笔工具只让白色叠加倒人物身上。而程序中,我们这么做会导致整个图像偏白,效果非常不理想。那么,我们就需要考虑一个新的思路来实现人脸美白效果。根据论文“A Two-Stage Contrast Enhancement Algorithm for Digital Images”,采用映射表,使原图在色阶上有所增强,并在图像两端亮度相对减弱,中间增强,则会产生不错的美白效果,又能使图像白的更自然。这里,我们提供一个美白映射表Color_list:Color_list = [ 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 31, 33, 35, 37, 39, 41, 43, 44, 46, 48, 50, 52, 53, 55, 57, 59, 60, 62, 64, 66, 67, 69, 71, 73, 74, 76, 78, 79, 81, 83, 84, 86, 87, 89, 91, 92, 94, 95, 97, 99, 100, 102, 103, 105, 106, 108, 109, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 127, 128, 130, 131, 133, 134, 135, 137, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 153, 154, 155, 156, 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 176, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 224, 225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232, 233, 233, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 256]作者:极客学编程链接:https://juejin.cn/post/6993257569489780773来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
实现人脸磨皮效果既然我们已经完全掌握了人脸磨皮的原理。下面,我们来直接实现人脸的磨皮效果,具体的代码如下所示:# 人脸磨皮 def facial_dermabrasion_effect(fileName): img = cv2.imread(fileName) blur_img = cv2.bilateralFilter(img, 31, 75, 75) #图像融合 result_img = cv2.addWeighted(img, 0.3, blur_img, 0.7, 0) cv2.imwrite("58_1.jpg", result_img) image = Image.open("58_1.jpg") # 锐度调节 enh_img = ImageEnhance.Sharpness(image) image_sharped = enh_img.enhance(1.5) # 对比度调节 con_img = ImageEnhance.Contrast(image_sharped) image_con = con_img.enhance(1.15) image_con.save("58_2.jpg") img1 = cv2.imread("58.jpg") img2 = cv2.imread("58_2.jpg") cv2.imshow("1", img1) cv2.imshow("2", img2) cv2.waitKey() cv2.destroyAllWindows() if __name__ == "__main__": facial_dermabrasion_effect("58.jpg") 复制代码运行之后,效果如下:这段代码的参数都是可以调整的,并不是一层不变的,感兴趣的读者可以自己调节参数试试效果,当然人脸磨皮只是看起来皮肤光滑了。下面结合美白的效果,就可以实现相机的那种美颜。作者:极客学编程链接:https://juejin.cn/post/6992794606408564767来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
人脸磨皮原理人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果。因为磨皮之后,脸部的杂质基本上就没有了,也可以说丢失了细节。那么肯定需要用到滤波函数。滤波的过程就是把图像的每一个像素值输入过滤器,得到平滑的图像。而我们常用的滤波有均值滤波,高斯滤波以及双边滤波三种,到底选用那种滤波呢?首先,均值滤波会因为是用周围像素的平均值代替原像素值,肯定会导致图像过于模糊,所以排除掉。其次,高斯滤波与均值滤波原理类似,只是高斯滤波器的模板系数会随着距离模板中心的增大而减小,虽然可以减弱图像的模糊程度,但是图像边缘信息会丢失。那么,只剩一个滤波了,也就是双边滤波器。因为它同时综合了高通滤波器和a-截尾均值过滤器的叠加效果,即可以保证图像不是非常模糊,也可以保留图像边缘信息。而人脸磨皮原理的步骤分为如下3个步骤:图像滤波图像融合图像锐化因为,不管上面3种滤波如何,都会导致一定的模糊(只是相对来说谁更优而已),所以需要对图像进行融合与锐化的操作。这样,可以保留一些图像的细节,以增强图像的真实感。其中,图像融合使用的函数就是cv2.addWeighted()图像加权函数。融合的是原图与双通滤波后的图像。最后,图像锐化使用的PIL库进行操作,使用它的ImageEnhance.Sharpness()函数自动调节图像的锐度与对比度。作者:极客学编程链接:https://juejin.cn/post/6992794606408564767来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
直接实现图片中的马赛克好像有点简单,我们不妨结合前文的捕捉摄像头的知识以及人脸检测知识,将马赛克用于视频之中。话不多说,我们直接上代码:# 将视频中的人脸替换成马赛克 def mosaic_video_effect(img): height, width, n = img.shape new_img = img.copy() size = 20 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=2, minSize=(5, 5)) for (x, y, w, h) in faces: for i in range(x + size, (x + w) - 1 - size, size): for j in range(y + size, (y + h) - 1 - size, size): if i - size > 0 and j + size < width and i + size < height and j - size > 0: i_rand = random.randint(i - size, i) j_rand = random.randint(j - size, j) new_img[i - size:i + size, j - size:j + size] = img[i_rand, j_rand, :] else: new_img[x:x + w, y:y + h] = [255, 255, 255] return new_img if __name__ == "__main__": cap = cv2.VideoCapture(0) while (cap.isOpened()): ret, frame = cap.read() frame = mosaic_video_effect(frame) cv2.imshow('video', frame) c = cv2.waitKey(1) if c == 27: break cap.release() cv2.destroyAllWindows() 复制代码这里需要注意的是,因为我们只部分遮挡人脸,所以并不是全屏马赛克,而当人脸移动到摄像头边缘时,这个时候i - size,j-size可能小于0,j + size,i + size可能大于宽度高度,将导致数组越界报错。所以,为了避免人脸在边缘时,越界赋值,我们判断在边缘时直接遮挡白色马赛克即可。作者:极客学编程链接:https://juejin.cn/post/6992442204354527262来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
马赛克算法原理在平常的生活中,我们会经常看到各种马赛克,比如某些宅男硬盘里的视频马赛克,有些直播犯罪嫌疑人的头像遮罩马赛克等。可以说在生活中,马赛克无处不在。因此,我们在学习OpenCV的同时,也要熟练掌握马赛克的应用。下面,我们来了解马赛克算法的几种实现原理:将需要马赛克的图像部位,全部赋值为该区域左上角的第一个像素值将需要马赛克的图像部位像素随机打乱随机用某一点代替需要马赛克区域内的所有像素值。本篇将详细介绍马赛克的处理操作。实现图片中的马赛克这里,我们使用3实现原理,通过随机用某一点代替需要马赛克区域内的所有像素值。具体代码如下所示:#马赛克操作 def mosaic_effect(img): new_img = img.copy() h, w, n = img.shape size = 10#马赛克大小 for i in range(size, h - 1 - size, size): for j in range(size, w - 1 - size, size): i_rand = random.randint(i - size, i) j_rand = random.randint(j - size, j) new_img[i - size:i + size, j - size:j + size] = img[i_rand, j_rand, :] return new_img if __name__ == "__main__": img = cv2.imread("49.jpg") cv2.imshow("0", img) cv2.imshow("1", mosaic_effect(img)) cv2.waitKey() cv2.destroyAllWindows() 复制代码可以看到,我们代码中设置的马赛克大小为10,在这个区域内,随机取一个像素点,将所有的像素都设置成该随机选取的像素值,这样就达到了马赛克的目的。而且对于原图来说,轮廓看起来还是没有变化的。效果如下:作者:极客学编程链接:https://juejin.cn/post/6992442204354527262来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
交叉编译器版本 MDC300_Ubuntu_Crossbuild_Devkit-1.0.105.2MDS版本 MDC_Development_Studio-Ubuntu18-1.0.105.2opencv为交叉编译器内自带的编译报错截图cmakelist文件target_link_libraries单独链接这两个文件还是提示找不到附件cmakelist文件和函数代码cmakelist文件部分截图代码截图
-
实现油画效果既然已经了解了实现油画效果的原理。下面,我们直接上代码来完成油画的操作。具体代码如下所示:# 油画效果 def oil_effect(img): h, w, n = img.shape new_img = np.zeros((h - 2, w, n), dtype=np.uint8) for i in range(h - 2): for j in range(w): if random.randint(1, 10) % 3 == 0: new_img[i, j] = img[i - 1, j] elif random.randint(1, 10) % 2 == 0: new_img[i, j] = img[i + 1, j] else: new_img[i, j] = img[i + 2, j] return new_img # 图像增强 def img_add(): img = Image.open("oil.jpg") enh_col = ImageEnhance.Color(img) color = 2.0 new_img = enh_col.enhance(color) new_img = cv2.cvtColor(np.asarray(new_img), cv2.COLOR_RGB2BGR) return new_img if __name__ == "__main__": img = cv2.imread("49.jpg") oil_img = oil_effect(img) cv2.imwrite("oil.jpg", oil_img) cv2.imshow("0", img) cv2.imshow("1", img_add()) cv2.waitKey() cv2.destroyAllWindows() 复制代码运行之后,效果如下:作者:极客学编程链接:https://juejin.cn/post/6992051940024647693来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
油画的实现原理油画简单的理解是带有艺术感的图像,色彩相对于原图要更加鲜艳,但却是失真的。而且对于喜欢欣赏艺术的读者,肯定或多或少关注过油画,油画并不细腻,而且小部分因为色块的堆积非常模糊。所以,我们实现油画的原理是:逐行对图像进行处理,使周围相邻距离的像素进行打乱。至于打乱的算法,你可以随机设计。不过,需要注意的是在处理到图像边缘时,比如左下角最后一个像素,那么如果打乱其像素,取右边的显然不可取,因为右边没有像素会导致数组越界。所以在处理油画时,可以人为的剪掉部分边缘像素用于混淆。还有,油画因为用色大胆,所以我们需要增强图像的色彩空间。而python的PIL库有一个现成的类ImageEnhance。该类专门用于图像的增强处理,不仅可以增强图像的亮度,对比度,色度,还可以增强图像的锐度,因此我们实现油画可以通过它快速实现图像增强的操作。下面,我们来看看其图像增强如何实现。代码如下:enh_col=ImageEnhance.Color(img) color = 2.0 new_img = enh_col.enhance(color) 复制代码此处的img是PIL读取的图片,如果想PIL读取图片转到OpenCV读取图片的格式可以通过如下代码完成:new_img = cv2.cvtColor(np.asarray(new_img), cv2.COLOR_RGB2BGR) 复制代码其中,new_img为PIL读取的图片格式。而enhance函数的参数color代表了图像色彩的丰富程度和饱和度,数值为1时保持色度不变,数值增加表示色度比例增加,以此达到图像增强的效果。作者:极客学编程链接:https://juejin.cn/post/6992051940024647693来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签