matlab图像增强分段线性函数_图像增强、锐化,利用 PythonOpenCV 来实现 4 种方法!...

图像增强目的使得模糊图片变得更加清晰、图片模糊的原因是因为像素灰度差值变化不大,图片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉

解决这个问题的最直接简单办法,放大像素灰度值差值、使图像中的细节更加清晰。

目前较为常用的几个方法:伽马变换、线性变换、分段线性变换、直方图均衡化,对于图像对比度增强,都能取得不错的效果!

本文将对每种方法 简单介绍一下,并借助于 Python 、OpenCV 进行代码实现,提前说一下哈,下面处理的图像对象都是单通道灰度图,不是三通道彩色图!

1,线性变换

线性变换的原理是对所有像素值乘上一个扩张因子 47ac948a9e33e82dcfff2e1be83aed53.png,像素值大的变得越大,像素值小的变得越小,从而达到图像增强的效果,这里利用 Numpy 的数组进行操作;ddd5bd75238efa2c913de95ceadb178f.png

需要注意的是,像素值最大为255,因此在数组相乘之后需要进行数值截断操作,最终代码如下:

def line_trans_img(img,coffient):
    if len(img.shape) == 3:
        img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    out = 2*img
    #像素截断;;;
    out[out>255] = 255
    out = np.around(out)
    return out

这里 47ac948a9e33e82dcfff2e1be83aed53.png 设置为 2 ,变换结果如下,会看到强光处出现失真效果

6502edde2c81ce8a2f63ddbc07bbe06b.png
line.png

(这里对排列图片做一下说明,从左到右依次为 原图灰度图、原图灰度直方图、处理之后的灰度图、处理之后的灰度直方图,以下的图片排列方式相同)

2,伽马变换

伽马变换对像素值做的是幂次方变换,主要是图像的灰度级发生改变,转换的原理公式为:9ccc393ecb79c842551ef0874790fa7e.png
参数  的设定 可以参照下面:

580dc56df7eff8065a1daef8b3acbdba.png
Snipaste_2020-05-26_20-18-17.png
  • 当>1 时,会减小灰度级较高的地方,增大灰度级较低的地方;

  • 当 <1 时,会增大灰度级较高的地方,减小灰度级较低的地方;

def gama_transfer(img,power1):
    if len(img.shape) == 3:
         img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img = 255*np.power(img/255,power1)
    img = np.around(img)
    img[img>255] = 255
    out_img = img.astype(np.uint8)
    return out_img

这里 Gamma 分别取 1.5,0.5,结果如下:

8a23696d29cc35b83813d030c304bc0d.png
gamma1.5.png
7a87b033ddbd5d44c7e4efefe41e068b.png
gamma0.5.png

结果来看,相对来说  对图像增强的结果会更好一点

3,分段线性分割

分段线性分割,提前把图像的灰度级分为几部分,然后对每一部分的像素值做不同的线性变换,像素值基本变换原理:2d9dd27d8d716a9dec7c06615f992381.png

这里写的代码总感觉效率特别慢(逐像素改变),知道改进方法的小伙伴们望告知:

def seg_augment_img(img,start,c1,end,c2,b2,c3,b3):
    if len(img.shape) == 3:
         img= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    out_img = np.zeros(img.shape)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if img[i][j]                 out_img[i][j] = img[i][j]*c1
            elif img[i][j]                 out_img[i][j] = img[i][j] *c2 + b2
            else:
                out_img[i][j] = img[i][j] * c3 +b3

    out_img[out_img>255] = 255
    out = np.around(out_img)
    out = out.astype(np.uint8)
    return out

函数中的参数分别为 50,0.5,150,3.6,-310,0.238,194,结果如下:

52347181498bc833a880c434210e3133.png
seg_line.png

4,直方图均衡化

每个灰度图像都有自己的灰度直方图,均衡化的原理是,先根据灰度直方图计算累加灰度直方图,根据灰度图与累加灰度图的映射关系关联输入图像与输出图图像的映射关系

映射关系原理如下:c52c18f06d512b1e9ef4f589b9e42471.png

因此,这里几个重要部分:1,计算出灰度直方图;2,计算累加灰度直方图;3,根据 1 和 2 得到映射关系,最终输出灰度像素值;

def get_imghist(img):
    # 判断图像是否为三通道;
    if len(img.shape) == 3:
        img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 无 Mask,256个bins,取值范围为[0,255]
    hist = cv2.calcHist([img],[0],None,[256],[0,255])
    return hist


def cal_equalhist(img):
    if len(img.shape) == 3:
         img= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    h,w = img.shape[:2]
    grathist = get_imghist(img)

    zerosumMoment = np.zeros([256],np.uint32)
    for p in range(256):
        if p ==0:
            zerosumMoment[p] = grathist[0]
        else:
            zerosumMoment[p] = zerosumMoment[p-1] +grathist[p]

    output_q = np.zeros([256],np.uint8)
    cofficient = 256.0/(h*w)
    for p in range(256):
        q = cofficient *float(zerosumMoment[p]) - 1
        if q >= 0:
            output_q[p] = math.floor(q)
        else:
            output_q[p] = 0

    equalhistimage = np.zeros(img.shape,np.uint8)
    for i in range(h):
        for j in range(w):
            equalhistimage[i][j] = output_q[img[i][j]]

    # 第二种方法,opencv 库函数自带一种:
    #equalhistimage = cv2.equalizeHist(img)
    return equalhistimage

结果如下,看起来还是不错的!(这里图片失真是因为灯光的原因)

cfb315e4388387d66fa35e7d3f5d6a44.png
equalhist.png

5,小总结

根据以上几个增强方法来看,针对于本案例选取的图像,线性增强方法相对效果并不太好,可能会适用于其它的种类图像,而 Gamma转换  和直方图均衡化取得相对不错的结果

但图像增强、锐化没有最优方法,每种方法都有自己的特点,需要根据自己选择合适的

最后还是要提醒一下感兴趣的小伙伴们,记得跟着敲一下代码,加深一下应用原理!

推荐阅读

不用 PS 抠图,Python + OpenCV  实现自动海报场景替换!

用 Python 对图片主体轮廓进行提取、颜色标记、并计算区域面积

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

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

相关文章

计算机考研保护一志愿,考研良心大学,保护一志愿的考研名校!

大家好&#xff0c;我是&#xff0c;今天胖胖要跟大家送一些重要的干货&#xff0c;就是对于选学校的小伙伴来说也好&#xff0c;或者是即将要参加研究生复试的小伙伴们来好胖胖在这里要跟大家说一个关于考研白名单的事情&#xff0c;因为大家都知道考研是会分黑名单和白名单&a…

华为备份历史版本_华为手机NAS备份时提示“需处于同一局域网”的解决方法

本内容来源于什么值得买APP&#xff0c;观点仅代表作者本人 &#xff5c;作者&#xff1a;噩梦飘雷创作立场声明&#xff1a;在使用华为手机向群晖NAS中备份时发现一直无法成功&#xff0c;经过一番研究找到了解决方案&#xff0c;希望能帮到大家~前言最近看了一位老哥的帖子&a…

【原创】自己编写的JavaGUI一键生成(hibernate/spring/mvc/maven)工具(附带视频教程源码)...

为什么80%的码农都做不了架构师&#xff1f;>>> 带项目源码&#xff08;https://git.oschina.net/qsyan/GeneratorFx&#xff09; app下载地址(附带视频教程)&#xff1a;http://download.csdn.net/detail/juyan2008/9769406 注明&#xff1a;此应用采用javafx编写…

普通计算机怎么算根号_大学专业介绍 | 计算机专业的真实就业情况

前两天给大家简单介绍了近些年比较火的计算机类相关专业具体都有哪些不同&#xff0c;以及就业时的行业或者岗位的侧重点。今天呢我们继续这个话题&#xff0c;来聊一聊整个计算机相关专业在学习和就业过程中大概是什么样子的&#xff0c;希望能够给大家提供一些实实在在的参考…

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类&#xff0c;并在其方法中实现对具有上述特点的类对象的创建。 根据具体产生类对象的方法定义形式&#xff0c;又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工…

高新园区到大连计算机学校,大连高新区中心小学

大连市高新区中心小学简介&#xff1a;大连市高新区中心小学始建于2009年9月&#xff0c;是大连高新技术产业园区筹建的第一所直属公办学校。学校现拥有2000多名学生&#xff0c;87名教职员工。学校确定了“办诗韵教育&#xff0c;让每个孩子都幸福的教育理念”&#xff0c;通过…

0限流电阻 stm32_上/下拉电阻

除了前一节讨论的拉电阻基本使用方法外&#xff0c;上拉电阻也可以提升高电平的电压阈值&#xff0c;以便于前后级信号相匹配&#xff0c;比如&#xff0c;TTL逻辑电平驱动CMOS逻辑电平时&#xff0c;我们通常会添加一个上拉电阻R1&#xff0c;如下图所示&#xff1a;But Why&a…

网段和子网的区别_电焊石笼网与普通石笼网区别

对于石笼网&#xff0c;每个人都会想到在河中&#xff0c;桥梁附近和大坝上充满石头的笼子结构。今天&#xff0c;我们谈论的是石笼网的一种电焊石笼网&#xff0c;它也是一种常见的石笼网&#xff0c;也被称为六边形石笼网。其功能与石笼网相同&#xff0c;但用法与普通石笼网…

jquery $(document).ready() 与window.onload的区别

转载博客&#xff1a;http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法&#xff0c;不过与window.onload方法还是有区别的。 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后…

小学三年级上册计算机计划,小学三年级数学上册教学计划

小学三年级数学上册教学计划一、班级情况分析这一学期我继续担任三年级数学教学工作&#xff0c;本班现有学生9人&#xff0c;其中男生3人&#xff0c;女生6人。三年级学生已经有两年的数学学习经历&#xff0c;对一些基础性的数学知识有了初步的认识。学生已经比较习惯于新教材…

centos7查看当前cpu运行模式_杂集:centos7中设置服务开机自启的两种方法,欢迎补充...

前言&#xff1a;在日常使用linux系统过程中&#xff0c;安装服务后系统不会自动启动服务的。就算手动启动了服务&#xff0c;只是当前生效&#xff0c;一旦服务器重启后&#xff0c;系统不会自动启动这些服务。如果每次重启服务器都要自己手动启动这些服务&#xff0c;一台还阔…

Sort HDU5884(二分+多叉哈夫曼树)

HDU5884 Sort 题意&#xff1a;有n个序列要进行归并&#xff0c;每次归并的代价是两个序列的长度的和&#xff0c;要求最终的代价不能超过规定的T&#xff0c;求在此前提下一次能同时进行归并的序列的个数k。 思路&#xff1a;还是太单纯&#xff0c;看完题目一直以为要用归并排…

Linux系统(五)负载均衡LVS集群之DR模式

序言 DR模式是lvs集群中三种负载均衡模式的其中一种&#xff0c;那么上一篇中我写啦关于NAT模式的搭建与原理&#xff0c;为什么还要有DR模式与IP隧道模式呢&#xff1f; 首先我们来看3张图。LVS/NAT模式如下图&#xff1a; LVS/IP隧道模式&#xff0c;如下图&#xff1a; LVS/…

Redux API之applyMiddleware

applyMiddleware(...middlewares) 使用包含自定义功能的 middleware 来扩展 Redux 是一种推荐的方式。Middleware 可以让你包装 store 的dispatch 方法来达到你想要的目的。同时&#xff0c; middleware 还拥有“可组合”这一关键特性。多个 middleware 可以被组合到一起使用&a…

计算机2018创业方向,推荐2018年创业的方向

原标题&#xff1a;推荐2018年创业的方向1 新电商传统的零售业收到互联网电商的重冲击&#xff0c;从而进行线上线下的结合是必然的趋势&#xff0c;新零售&#xff0c;新电商&#xff0c;是几千万零售企业成功转型的必然之路&#xff0c;学习一套全面的新电商转型的方法&#…

包无法安装_详细教程 | 安装Python编程环境以及使用OpenpyXl操作Excel

详细教程 | 安装Python编程环境以及使用OpenpyXl操作Excel注意&#xff1a;下列教程为 Windows7 64位&#xff1b;Windows 10有部分步骤有差异&#xff0c;请参考使用&#xff01;01 下载Python程序安装包首先前往Python官网 www.python.org,进入官网点击 Downloads,然后点击 W…

request重定向_golang不想http自动处理重定向的解决方案

前言有时候发送http请求不想让库自动帮忙处理重定向&#xff0c;库里面默认的是会把所有重定向都完成一遍&#xff0c;结果就是最后一个没有重定向的请求的结果。因此需要一种方案直接获取首次访问的结果&#xff0c;不走重定向。go的http库里面是使用如下代码检查重定向的&…

float foo=42e1为什么错_为什么重写了equals()也要重写hashCode()

小Hub领读&#xff1a;虽然是很基础的一篇文章&#xff0c;但是对于equals、hashcode两个方法&#xff0c;相信很多人都与其中的规则不熟悉&#xff0c;来跟着小Hub花个8分钟回顾一下&#xff01;作者&#xff1a;不学无数的程序员https://my.oschina.net/u/4030990/blog/31341…

ssh客户端_一款基于TAS框架的SSH客户端蠕虫

TEA是一款基于TAS框架的SSH客户端蠕虫&#xff0c;从本质上说&#xff0c;它是一个仿冒的SSH客户端&#xff0c;它能够修改tty输入/输出来实现任意命令执行&#xff0c;或通过SSH连接来上传自身以实现渗透感染。为了实现该工具的正常功能&#xff0c;远程主机需要满足以下条件&…

分享到系统面板_win7电脑没有nvidia控制面板怎么办【解决方法】

我们在使用电脑的时候&#xff0c;当电脑显卡出现问题导致屏幕画面不清晰时&#xff0c;可以使用win7系统自带nvidia控制面板&#xff0c;它能够对显卡进行设置&#xff0c;提升显卡功能&#xff0c;不过很多电脑用户点击nvidia控制面板时却提示nvidia显示设置不可用&#xff0…