当前位置: 首页 > news >正文

摄影师网站html5电商网站建设合同

摄影师网站html5,电商网站建设合同,京东联盟如何做查优惠卷的网站,山东网站定制设计第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg#xff0c;您可以从本教程链接的存储库中下载该文件#xff1a; 该二值图像的左侧显示黑色背景上的白点#xff0c;而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用… 第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg您可以从本教程链接的存储库中下载该文件 该二值图像的左侧显示黑色背景上的白点而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用二进制图像 ImageFilter.MinFilter(3)作为该方法的参数来实现此目的.filter()。3x3此过滤器将像素的值替换为以该像素为中心的阵列中九个像素的最小值。在二值图像中这意味着如果某个像素的任何相邻像素为零则该像素的值将为零。 ImageFilter.MinFilter(3)通过对图像应用多次您可以看到侵蚀的效果dot_and_hole.jpg。您应该继续使用与上一节中相同的 REPL 会话 from PIL import ImageFilterfilename dot_and_hole.jpg with Image.open(filename) as img: ... img.load() ... for _ in range(3): ... img img.filter(ImageFilter.MinFilter(3)) ... img.show()您已使用循环应用了三次过滤器for。此代码给出以下输出 由于侵蚀圆点缩小了但孔却变大了。 膨胀是与腐蚀相反的过程。白色像素被添加到二值图像的边界。您可以使用 来实现膨胀ImageFilter.MaxFilter(3)如果某个像素的任何邻居是白色则该像素将其转换为白色。 您可以对包含点和孔的同一图像应用膨胀您可以再次打开并加载该图像 with Image.open(filename) as img: ... img.load() ... for _ in range(3): ... img img.filter(ImageFilter.MaxFilter(3)) ... img.show()点现在变大了洞缩小了 您可以同时使用腐蚀和膨胀来填充孔洞并从二值图像中删除小对象。使用带有点和孔的图像您可以执行十次腐蚀循环来删除点然后执行十次膨胀循环以将孔恢复到其原始大小 with Image.open(filename) as img: ... img.load() ... for _ in range(10): ... img img.filter(ImageFilter.MinFilter(3)) ... img.show() for _ in range(10): ... img img.filter(ImageFilter.MaxFilter(3)) ... img.show()您可以使用第一个for循环执行十个侵蚀循环。此阶段的图像如下 该点已消失并且该孔比原始图像中的孔更大。第二个for循环执行十个膨胀周期使孔返回到其原始大小 然而该点不再出现在图像中。侵蚀和膨胀修改了图像以保留孔但移除点。所需的腐蚀和膨胀的数量取决于图像和您想要实现的目标。通常您需要通过反复试验找到正确的组合。 您可以定义函数来执行多个腐蚀和膨胀循环 def erode(cycles, image): ... for _ in range(cycles): ... image image.filter(ImageFilter.MinFilter(3)) ... return image ... def dilate(cycles, image): ... for _ in range(cycles): ... image image.filter(ImageFilter.MaxFilter(3)) ... return image ...这些函数使对图像进行腐蚀和膨胀实验变得更加容易。当您继续将猫放入修道院时您将在下一节中使用这些函数。 二、使用阈值分割图像 您可以对之前获得的阈值图像使用一系列侵蚀和膨胀以删除遮罩中不代表猫的部分并填充包含猫的区域中的任何间隙。一旦您尝试了腐蚀和膨胀您将能够在试错过程中使用有根据的猜测来找到腐蚀和膨胀的最佳组合以实现理想的蒙版。 从您之前获得的图像开始img_cat_threshold您可以从一系列腐蚀开始以删除代表原始图像中背景的白色像素。您应该继续在与前面部分相同的 REPL 会话中工作 step_1 erode(12, img_cat_threshold)step_1.show()腐蚀后的阈值图像不再包含代表图像背景的白色像素 然而剩下的面具比猫的整体轮廓要小并且内部有孔和间隙。您可以执行扩张来填补空白 step_2 dilate(58, step_1)step_2.show()五十八个膨胀周期填充了掩模中的所有孔得到以下图像 不过这个面具太大了。因此您可以通过一系列侵蚀来完成该过程 cat_mask erode(45, step_2)cat_mask.show()结果是一个可以用来分割猫图像的蒙版 您可以通过模糊此蒙版来避免二元蒙版的锐边。您必须首先将其从二值图像转换为灰度图像 cat_mask cat_mask.convert(L)cat_mask cat_mask.filter(ImageFilter.BoxBlur(20))cat_mask.show()过滤BoxBlur()器返回以下掩码 面具现在看起来像一只猫现在您已准备好从背景中提取猫的图像 blank img_cat.point(lambda _: 0)cat_segmented Image.composite(img_cat, blank, cat_mask)cat_segmented.show()首先创建一个与 img_cat 大小相同的空白图像。您可以使用 .point() 并将所有值设置为零从 img_cat 创建一个新的 Image 对象。接下来使用 PIL.Image 中的 composite() 函数创建由 img_cat 和空白组成的图像并使用 cat_mask 来确定使用每个图像的哪些部分。合成图像如下所示 您已经分割了猫的图像并从背景中提取了猫。 三、图像叠加使用Image.paste() 您可以更进一步将猫的分割图像从本教程的图像存储库粘贴到修道院庭院的图像中 filename_monastery monastery.jpgwith Image.open(filename_monastery) as img_monastery: ... img_monastery.load() img_monastery.paste( ... img_cat.resize((img_cat.width // 5, img_cat.height // 5)), ... (1300, 750), ... cat_mask.resize((cat_mask.width // 5, cat_mask.height // 5)), ... ) img_monastery.show()您曾经.paste()将一张图像粘贴到另一张图像上。该方法可以与三个参数一起使用 第一个参数是要粘贴的图像//。您使用整数除法运算符 ( ) 将图像大小调整为其大小的五分之一。第二个参数是主图像中要粘贴第二张图片的位置。该元组包含主图像中要放置要粘贴的图像左上角的坐标。如果您不想粘贴整个图像第三个参数提供您希望使用的蒙版。 您已使用通过阈值处理、腐蚀和膨胀过程获得的蒙版来粘贴没有背景的猫。输出如下图所示 您已将猫从一张图像中分割出来并将其放入另一张图像中以显示猫安静地坐在修道院庭院中而不是原始图像中它坐在田野中。 四、创建水印 本示例中的最终任务是将 Real Python 徽标作为水印添加到图像中。您可以从本教程随附的存储库中获取带有 Real Python 徽标的图像文件 获取图像 单击此处访问您将使用 Pillow 操作和处理的图像。 您应该继续在同一个 REPL 会话中工作 logo realpython-logo.pngwith Image.open(logo) as img_logo: ... img_logo.load() ... img_logo Image.open(logo)img_logo.show()这是全尺寸的彩色徽标 您可以将图像更改为灰度并使用阈值.point()将其转换为黑白图像。您还可以缩小其尺寸并将其转换为轮廓图像 img_logo img_logo.convert(L)threshold 50img_logo img_logo.point(lambda x: 255 if x threshold else 0)img_logo img_logo.resize( ... (img_logo.width // 2, img_logo.height // 2) ... )img_logo img_logo.filter(ImageFilter.CONTOUR)img_logo.show()输出显示 Real Python 徽标的轮廓。该轮廓非常适合用作图像上的水印 要将其用作水印您需要反转颜色使背景为黑色只有要保留的轮廓为白色。您可以.point()再次使用以下方法来实现此目的 img_logo img_logo.point(lambda x: 0 if x 255 else 255)img_logo.show()您已经转换了值为 的像素255并为它们分配了值0将它们从白色像素转换为黑色像素。您将剩余的像素设置为白色。反转轮廓标志如下所示 最后一步是将这个轮廓粘贴到坐在修道院庭院里的猫的图像上。您可以.paste()再次使用 img_monastery.paste(img_logo, (480, 160), img_logo)img_monastery.show()第一个参数.paste()表示您要粘贴的图像第三个参数表示蒙版。在本例中您将使用相同的图像作为蒙版因为该图像是二值图像。第二个参数提供要粘贴图像的区域的左上角坐标。 该图像现在包含一个真正的 Python 水印 水印具有矩形轮廓这是您之前使用的轮廓过滤器的结果。如果您希望删除此轮廓可以使用 裁剪图像.crop()。这是一个您可以自己尝试的练习。 五、使用 NumPy 和 Pillow 进行图像处理 Pillow 具有多种内置功能和过滤器可供选择。然而有时您需要进一步操作超出 Pillow 中现有功能的图像。 您可以借助NumPy进一步操作图像。NumPy 是一个非常流行的用于处理数值数组的 Python 库它是与 Pillow 一起使用的理想工具。您可以在NumPy 教程使用 Python 进入数据科学的第一步中了解有关 NumPy 的更多信息。 将图像转换为 NumPy 数组时您可以直接对数组中的像素执行所需的任何转换。在 NumPy 中完成处理后您可以Image使用 Pillow 将数组转换回对象。您需要为此部分安装 NumPy (venv) $ python -m pip install numpy现在您已经安装了 NumPy您可以使用 Pillow 和 NumPy 来发现两个图像之间的差异。 5.1 使用 NumPy 相互减去图像 看看您是否能找出以下两幅图像之间的差异 这不是一件难事然而你决定作弊并编写一个 Python 程序来为你解决这个难题。您可以从本教程附带的存储库下载图像文件house_left.jpg和house_right.jpg图像来源 获取图像 单击此处访问您将使用 Pillow 操作和处理的图像。 第一步是使用 Pillow 读取图像并将其转换为 NumPy 数组 import numpy as npfrom PIL import Image with Image.open(house_left.jpg) as left: ... left.load() ...with Image.open(house_right.jpg) as right: ... right.load() ... left_array np.asarray(left)right_array np.asarray(right) type(left_array) class numpy.ndarraytype(right_array) class numpy.ndarray由于left_array和right_array是 类型的对象numpy.ndarray因此您可以使用 NumPy 中提供的所有工具来操作它们。您可以从一个数组中减去另一个数组以显示两个图像之间不同的像素 difference_array right_array - left_arraytype(difference_array) class numpy.ndarray当您从另一个相同大小的数组中减去一个数组时结果是另一个与原始数组具有相同形状的数组。Image.fromarray()您可以使用Pillow将此数组转换为图像 difference Image.fromarray(difference_array)difference.show()将一个 NumPy 数组减去另一个 NumPy 数组并转换为 Pillow 的结果Image是如下所示的差异图像 差异图像仅显示原始图像的三个区域。这些区域突出了两个图像之间的差异。您还可以看到云和栅栏周围有一些噪点这是由于这些项目周围区域的原始 JPEG 压缩发生了微小变化。 5.2 使用 NumPy 创建图像 您可以更进一步使用 NumPy 和 Pillow 从头开始​​创建图像。您可以从创建灰度图像开始。在此示例中您将创建一个包含正方形的简单图像但您可以用相同的方式创建更复杂的图像 import numpy as npfrom PIL import Image square np.zeros((600, 600))square[200:400, 200:400] 255 square_img Image.fromarray(square)square_img PIL.Image.Image image modeF size600x600 at 0x7FC7D8541F70 square_img.show()您创建一个大小随处包含零的数组600x600。接下来将数组中心的一组像素的值设置为255。 您可以使用行和列对 NumPy 数组进行索引。在此示例中第一个切片表示的200:400行。逗号后面的第二个切片表示的列。200399200:400200399 您可以使用Image.fromarray()将 NumPy 数组转换为 类型的对象Image。上面代码的输出如下所示 您已经创建了一个包含正方形的灰度图像。当您使用 时会自动推断图像的模式Image.fromarray()。在这种情况下使用模式F它对应于具有 32 位浮点像素的图像。如果您愿意可以将其转换为更简单的 8 位像素灰度图像 square_img square_img.convert(L)您还可以更进一步创建彩色图像。您可以重复上述过程来创建三张图像一张对应于红色通道另一张对应于绿色通道最后一张对应于蓝色通道 red np.zeros((600, 600))green np.zeros((600, 600))blue np.zeros((600, 600))red[150:350, 150:350] 255green[200:400, 200:400] 255blue[250:450, 250:450] 255 red_img Image.fromarray(red).convert(L)green_img Image.fromarray(green).convert(L)blue_img Image.fromarray((blue)).convert(L)您从每个 NumPy 数组创建一个Image对象并将图像转换为 mode L它表示灰度。现在您可以使用以下命令将这三个单独的图像合并为一个 RGB 图像Image.merge() square_img Image.merge(RGB, (red_img, green_img, blue_img))square_img PIL.Image.Image image modeRGB size600x600 at 0x7FC7C817B9D0 square_img.show()第一个参数Image.merge()是图像输出的模式。第二个参数是包含各个单波段图像的序列。此代码创建以下图像 您已将单独的波段组合成 RGB 彩色图像。在下一节中您将更进一步使用 NumPy 和 Pillow 创建 GIF 动画。 六、创建动画 在上一节中您创建了一个彩色图像其中包含三个不同颜色的重叠正方形。在本部分中您将创建一个动画显示这三个方块合并为一个白色方块。您将创建包含三个正方形的图像的多个版本并且连续图像之间的正方形位置会略有不同 import numpy as npfrom PIL import Image square_animation []for offset in range(0, 100, 2): ... red np.zeros((600, 600)) ... green np.zeros((600, 600)) ... blue np.zeros((600, 600)) ... red[101 offset : 301 offset, 101 offset : 301 offset] 255 ... green[200:400, 200:400] 255 ... blue[299 - offset : 499 - offset, 299 - offset : 499 - offset] 255 ... red_img Image.fromarray(red).convert(L) ... green_img Image.fromarray(green).convert(L) ... blue_img Image.fromarray((blue)).convert(L) ... square_animation.append( ... Image.merge( ... RGB, ... (red_img, green_img, blue_img) ... ) ... ) ...您创建一个名为 的空列表square_animation用于存储您生成的各种图像。在for循环中您为红色、绿色和蓝色通道创建 NumPy 数组如上一节中所做的那样。包含绿色层的数组始终相同代表图像中心的一个正方形。 红色方块从移至中心左上角的位置开始。在每个连续帧中红色方块都会向中心移动直到在循环的最终迭代中到达中心。蓝色方块最初向右下角移动然后随着每次迭代向中心移动。 请注意在此示例中您正在迭代range(0, 100, 2)这意味着变量offset以 2 为步长增加。 您之前了解到可以Image使用 将对象保存到文件中Image.save()。您可以使用相同的功能保存到包含图像序列的 GIF 文件。您调用Image.save()序列中的第一张图像这是您存储在列表中的第一张图像square_animation square_animation[0].save( ... animation.gif, save_allTrue, append_imagessquare_animation[1:] ... )第一个参数.save()是要保存的文件的文件名。文件名中的扩展名告诉我们.save()需要输出什么文件格式。您还可以在中包含两个关键字参数.save() save_allTrue确保序列中的所有图像都被保存而不仅仅是第一个图像。append_imagessquare_animation[1:]允许您将序列中的剩余图像附加到 GIF 文件。 此代码保存animation.gif到文件然后您可以使用任何图像软件打开 GIF 文件。GIF 默认情况下应该循环但在某些系统上您需要添加关键字参数loop0以.save()确保 GIF 循环。您得到的动画如下 三个不同颜色的方块合并成一个白色方块。您可以使用不同的形状和不同的颜色创建自己的动画吗 七、结论 您已经学习了如何使用 Pillow 处理图像并执行图像处理。如果您喜欢处理图像您可能想一头扎进图像处理的世界。关于图像处理的理论和实践还有很多东西需要学习。一个很好的起点是Gonzalez 和 Woods 的《数字图像处理》这是该领域的经典教科书。 Pillow 并不是唯一可以在 Python 中用于图像处理的库。如果您的目标是执行一些基本处理那么您在本教程中学到的技术可能就是您所需要的。如果您想深入了解更先进的图像处理技术例如机器学习和计算机视觉应用那么您可以使用 Pillow 作为其他库例如 OpenCV 和 scikit-image的垫脚石。
http://www.zqtcl.cn/news/699026/

相关文章:

  • 企业网站管理系统添加教程如何用python开发网页
  • 公司网站建设需要资质wordpress admin
  • 万维网网站301重定向怎么做国家城乡建设规划部网站
  • 现在的网站内容区域做多宽俄文网站开发翻译
  • 上海闵行建设局官方网站做电影网站的流程
  • 怎样做水族馆网站wordpress第三方订阅地址
  • 东莞做网站注意事项如何查网站的百度快照
  • 做资源网站需要什么郑州哪有做网站的公司
  • 不属于网站架构开发一个游戏软件多少钱
  • 电子商务网站建设 市场分析广州有哪些做网站专业的公司
  • 广州网站建设南宁厦门城健建设有限公司网站
  • 课程网站开发的研究现状网页设计制作音乐网站
  • 建设工程法律网站网站美工做专题尺寸多少?
  • 甘肃制作网站godaddy wordpress空间
  • 做淘宝客网站要多少钱心理网站模板
  • 建设手机网站经验分享网站外链建设实例
  • 乔拓云网站注册外贸个人网站
  • 个人怎么做动漫短视频网站建设银行银监会官方网站
  • 长沙网站seo技术厂家山东济宁网站建设设计
  • 外贸网站制作有哪些做体育的网站
  • 广州哪里有做网站推广最牛的网站建
  • 建设网站用户名是什么原因世界500强企业排名2020
  • 创建网站要找谁手机网站后台源码
  • canvas网站源码网站静态和动态区别
  • 网站建设需要了解哪些方面数据分析工具
  • 求个网站没封的2021网站建设初步课程介绍
  • 沈阳网站前端网站建栏目建那些
  • 经典网站案例江苏省建设厅官网
  • 公司建设网站需要多少钱重庆房产网站建设
  • 鹤岗市建设局网站可信网站认证有用吗