python图像锐化_Python图像处理介绍--图像模糊与锐化

f8db4e365a8dc3fc8894a046439edaa1.png

欢迎关注 “小白玩转Python”,发现更多 “有趣”

引言

在之前的文章中,我们讨论了边缘检测内核。在本文我们将讨论如何在图像上应用模糊与锐化内核,将这些内核应用到彩色图像上,同时保留核心图像。

一如既往,我们从导入所需的python库开始。

import numpy as np

import matplotlib.pyplot as plt

from skimage.io import imshow, imread

from skimage.color import rgb2yuv, rgb2hsv, rgb2gray, yuv2rgb, hsv2rgb

from scipy.signal import convolve2d

读取本文将使用的图像。

dog = imread('fire_dog.png')

plt.figure(num=None, figsize=(8, 6), dpi=80)

imshow(dog);

ee136c3e7c435f3c7264ca6f7565d828.png

现在我们应用于图像的内核是高斯模糊内核和锐化内核。

# Sharpen

sharpen = np.array([[0, -1, 0],

[-1, 5, -1],

[0, -1, 0]])

# Gaussian Blur

gaussian = (1 / 16.0) * np.array([[1., 2., 1.],

[2., 4., 2.],

[1., 2., 1.]])

fig, ax = plt.subplots(1,2, figsize = (17,10))

ax[0].imshow(sharpen, cmap='gray')

ax[0].set_title(f'Sharpen', fontsize = 18)

ax[1].imshow(gaussian, cmap='gray')

ax[1].set_title(f'Gaussian Blur', fontsize = 18)

[axi.set_axis_off() for axi in ax.ravel()];

df0ab3ea83b09523533c6673d0cde9eb.png

但我们如何将这些内核应用到我们的图像中呢?那么,让我们直接通过卷积来试试。

def multi_convolver(image, kernel, iterations):

for i in range(iterations):

image = convolve2d(image, kernel, 'same', boundary = 'fill',

fillvalue = 0)

return image

multi_convolver(dog, gaussian, 2)

421aac585d79ff733ec6276e0aee135c.png

很显然,我们出现了维数错误。当我们将一个矩阵与另一个矩阵卷积时,它们的维数应该是相同的。因此,我们必须先将图像转化为灰度。

dog_grey = rgb2gray(dog)

plt.figure(num=None, figsize=(8, 6), dpi=80)

imshow(dog_grey);

d35ba0bc5dc6ed900789f0fc01a49457.png

现在我们可以运行上面的卷积函数并得到预期的效果。

convolved_image = multi_convolver(dog_grey, gaussian, 2)

plt.figure(num=None, figsize=(8, 6), dpi=80)

imshow(convolved_image);

7f28c95ba254af1e4ec3e77485a93bbf.png

我们可以清楚的看到,图像已经模糊了。下面的代码将告诉我们如果继续运行高斯模糊卷积图像会发生什么。

def convolution_plotter(image, kernel):

iterations = [1,10,20,30]

f_size = 20

fig, ax = plt.subplots(1,4, figsize = (15,7))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'Iteration : {iterations[n]}', fontsize =

f_size)

ax.imshow(multi_convolver(image, kernel, iterations[n]),

cmap='gray')

ax.set_axis_off()

fig.tight_layout()

convolution_plotter(dog_grey, gaussian)

0c8ef2e34ebf047b58227e6b8416c0aa.png

可以看到图像变得越来越模糊了。

如果需要使图像模糊并保留颜色怎么办?让我们首先尝试对每个颜色通道应用卷积。

def convolver_rgb(image, kernel, iterations = 1):

convolved_image_r = multi_convolver(image[:,:,0], kernel,

iterations)

convolved_image_g = multi_convolver(image[:,:,1], kernel,

iterations)

convolved_image_b = multi_convolver(image[:,:,2], kernel,

iterations)

reformed_image = np.dstack((np.rint(abs(convolved_image_r)),

np.rint(abs(convolved_image_g)),

np.rint(abs(convolved_image_b)))) /

255

fig, ax = plt.subplots(1,3, figsize = (17,10))

ax[0].imshow(abs(convolved_image_r), cmap='Reds')

ax[0].set_title(f'Red', fontsize = 15)

ax[1].imshow(abs(convolved_image_g), cmap='Greens')

ax[1].set_title(f'Green', fontsize = 15)

ax[2].imshow(abs(convolved_image_b), cmap='Blues')

ax[2].set_title(f'Blue', fontsize = 15)

[axi.set_axis_off() for axi in ax.ravel()]

return np.array(reformed_image).astype(np.uint8)

convolved_rgb_gauss = convolver_rgb(dog, gaussian, 2)

ff4a44d4e67fef1bb5fdf904031ecd2d.png

上面这个函数实际上将给我们返回重新生成的图像,我们只需要将其插入到imshow函数中即可。

plt.figure(num=None, figsize=(8, 6), dpi=80)

imshow(convolved_rgb_gauss);

9d7e0ec4b74bfdaaf5b106dc7f87706e.png

让我们看看卷积十次后图像会变成什么样。

f81018150c4adf7dcb8318a8271ba5d2.png

现在让我们尝试下更换锐化内核会发生什么。

convolved_rgb_sharpen = convolver_rgb(dog, sharpen, 1)

c1c2a267bc5279ad04da780206b5ae31.png

1fb4a2e5e17672d117c8d10fd2880727.png

处理后的图像有一些轻微的扭曲,为什么会这样呢?

请记住,RGB颜色空间隐式地将像素的光照与颜色混合。这意味着在不改变颜色的情况下对图像的光照应用卷积几乎是不可能的。那么我们如何处理这个问题呢?

解决此问题的一种方法是更改图像的色彩空间。除了使用RGB颜色空间外,我们还可以使用YUV颜色空间。因为YUV空间中的光照通道实际上是与颜色分开的。

现在我们编写一个函数,它首先将图像转换为YUV色彩空间,然后对图像进行卷积。

def convolver_rgb(image, kernel, iterations = 1):

img_yuv = rgb2yuv(image)

img_yuv[:,:,0] = multi_convolver(img_yuv[:,:,0], kernel,

iterations)

final_image = yuv2rgb(img_yuv)

fig, ax = plt.subplots(1,2, figsize = (17,10))

ax[0].imshow(image)

ax[0].set_title(f'Original', fontsize = 20)

ax[1].imshow(final_image);

ax[1].set_title(f'YUV Adjusted, Iterations = {iterations}',

fontsize = 20)

[axi.set_axis_off() for axi in ax.ravel()]

fig.tight_layout()

return final_image

final_image = convolver_rgb(dog, sharpen, iterations = 1)

753b45f1649a9500e9a22096bff16249.png

现在可以看到,处理后的图像是明显锐化且没有任何颜色扭曲的。还有许多其他的方法来解决这个问题,YUV转换只是其中之一,我们还可以使用HSV来解决这个问题。

def convolver_comparison(image, kernel, iterations = 1):

img_yuv = rgb2yuv(image)

img_yuv[:,:,0] = multi_convolver(img_yuv[:,:,0], kernel,

iterations)

final_image_yuv = yuv2rgb(img_yuv)

img_hsv = rgb2hsv(image)

img_hsv[:,:,2] = multi_convolver(img_hsv[:,:,2], kernel,

iterations)

final_image_hsv = hsv2rgb(img_hsv)

convolved_image_r = multi_convolver(image[:,:,0], kernel,

iterations)

convolved_image_g = multi_convolver(image[:,:,1], kernel,

iterations)

convolved_image_b = multi_convolver(image[:,:,2], kernel,

iterations)

final_image_rgb = np.dstack((np.rint(abs(convolved_image_r)),

np.rint(abs(convolved_image_g)),

np.rint(abs(convolved_image_b)))) /

255

fig, ax = plt.subplots(2,2, figsize = (17,17))

ax[0][0].imshow(image)

ax[0][0].set_title(f'Original', fontsize = 30)

ax[0][1].imshow(final_image_rgb);

ax[0][1].set_title(f'RGB Adjusted, Iterations = {iterations}',

fontsize = 30)

fig.tight_layout()

ax[1][0].imshow(final_image_yuv)

ax[1][0].set_title(f'YUV Adjusted, Iterations = {iterations}',

fontsize = 30)

ax[1][1].imshow(final_image_hsv)

ax[1][1].set_title(f'HSV Adjusted, Iterations = {iterations}',

fontsize = 30)

[axi.set_axis_off() for axi in ax.ravel()]

fig.tight_layout()

convolver_comparison(dog, sharpen, iterations = 1)

2f6837247b755f0a1d3a1d53b01df2af.png

我们看到,与原始RGB方法相比,HSV和YUV有了一些改进。为了更好地说明,我们可以将迭代次数从1增加到2。

52995aa29efe7df978f166f244bd05e1.png

在2次迭代后,失真变得更加明显。但是也很清楚,HSV和Y'UV调整后的图像比原始RGB调整后的图像要好得多。在选择将卷积内核应用于图像的最佳方法时,应当牢记这些特性。

总结

在本文中,我们已经学会了如何对图像进行模糊和锐化卷积。这些技术对于任何从事图像处理和计算机视觉领域的人员都是至关重要的。非常重要的是,我们了解到,简单地将卷积应用到各个RGB通道可能不是最好的方法。在处理图像时,我们应该始终意识到有大量不同类型的色彩空间可以使用。

·  END  ·

HAPPY LIFE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse配置初始化(自用)

以上都是性能调优的配置,下面是其他常用的配置和优化 设置utf-8编码 window -> preferences -> General -> workplace中text file encoding改为utf-8 设置properties文件编码window -> preferences -> General -> Content Types —> Text —&g…

java bits_一段关于JAVA程序升级的问题(Changing bits)

展开全部import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;import javax.…

java合并两个有序链表_JS实现的合并两个有序链表算法示例

本文实例讲述了JS实现的合并两个有序链表算法。分享给大家供大家参考,具体如下:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出&…

外墙设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露

Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能。我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据。NMT介绍工欲善其事必先利其器,我们先把相关需要的配置和工具介绍清楚,再通过例子来看看具体如何使用NMT。打开NMT…

Charles 从入门到精通

目录与版权 转载请保留顶部的 Charles 中国特惠内容,本文的内容主要包括: Charles 的简介如何安装 Charles将 Charles 设置成系统代理Charles 主界面介绍过滤网络请求截取 iPhone 上的网络封包截取 Https 通讯信息模拟慢速网络修改网络请求内容给服务器做…

java 批量验证_正则表达式批量验证函数

正则表达式批量验证函数function checkData(){//判断数据的正确性var idSpans new Array();idSpans[0] new Array("item_4","^[\\s\\S]{1,16}$","productName","商机名称应在1-16字以内","",true); idSpans[1] new Array(…

css3制作炫酷导航栏效果 转

今天主要利用hover选择器。鼠标滑过查看效果。 一。普通导航栏 HomeContentServiceTeamContact对于这种普通的导航栏,只是鼠标滑过的时候颜色会变,所以思路变得很简单。 (1)使用ul标签布局 (2)鼠标经过事件…

桥梁设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

简单的遮罩层加登录窗效果

<!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>遮罩层加登录窗</title> <style type"text/css"> #wrap{width: 60px;height: 30px; position: absolute; text-align: center; line-height: 30…

java上机面试题 039_深入 Java 虚拟机之面试总结篇

在学习 JVM 相关知识&#xff0c;怎么让自己有动力看下去&#xff0c;且有思考性呢&#xff1f;笔者认为&#xff0c;开头用一些常用的面试题&#xff0c;来引入读者的兴趣比较好&#xff0c;这样才会有看下去的动力。所以&#xff0c;该篇文章会以面试总结的方式&#xff0c;希…

常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

1、Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口。JDK 安全 API 是 Java 编程语言的核心 API&#xff0c;位于 java.security 包&#xff08;及其子包&#xff09;&#xff0c;以及sun.securityAPI包&#xff08;及其子包&#xff0…

状态设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

python基础——错误处理

python基础——错误处理 在程序运行的过程中&#xff0c;如果发生了错误&#xff0c;可以事先约定返回一个错误代码&#xff0c;这样&#xff0c;就可以知道是否有错&#xff0c;以及出错的原因。在操作系统提供的调用中&#xff0c;返回错误码非常常见。比如打开文件的函数ope…

java获取数组的最小值_Java 数组获取最大和最小值的实例实现

以下实例演示了如何通过 Collections 类的 Collections.max() 和 Collections.min() 方法来查找数组中的最大和最小值&#xff1a;Main.java 文件&#xff1a;import java.util.Arrays;import java.util.Collections;public class Main {public static void main(String[] args…

Spring_事务(2)

转载于:https://www.cnblogs.com/yang-hao/p/5830952.html

heroku_本月风味– Neo4j和Heroku

herokuNeo4j今年早些时候发起了一项挑战&#xff0c;即“ 种子播云 ”&#xff0c;以使人们使用Neo4j附加组件在Heroku上创建模板或演示应用程序。 经过许多内部辩论之后&#xff0c;我决定进入&#xff0c;但由于缺乏想法而陷入绝望。 当我没有做任何特别的事情时&#xff0c;…

代理设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

春云边车

我有一个部署到基于NetflixOSS的云的应用程序&#xff0c;该应用程序具有以下结构&#xff1a; 本质上是一种将信息持久保存到Cassandra群集的服务。 所有应用程序都已注册到Eureka –因此&#xff0c;在本例中&#xff0c;该服务以及Cassandra节点都已在Eureka中注册&#xf…

activemq端口好_ActiveMQ已准备好黄金时段

activemq端口好ActiveMQ项目始于2005年-在很大程度上&#xff0c;它一直是Apache Software Foundation的顶级项目。 ActiveMQ项目的目的一直是提供世界一流的企业消息传递解决方案&#xff0c;使经纪人能够提供从支持IP的智能设备一直到企业后端的高可用性的连通性。 ActiveMQ提…