基于python的数字图像处理--学习笔记(三)

2023-11-10

基于python的数字图像处理--学习笔记(三)


前言

进入冈萨雷斯的第三章内容,并用python实现功能。我更改了代码源,之前找到太烂了,代码全是错、、现在使用的代码很清晰,功能也很全。


一、灰度拉伸

灰度拉伸, 也称对比度拉伸, 是一种简单的线性点运算 ,扩展图像的直方图使其充满整个灰度等级范围内.

代码如下(示例):

"""
Created by HenryMa on 2020/8/24
"""

__author__ = 'HenryMa'


import math
# from builtins import range, print
import numpy as np
import cv2


def contrastStretchTransform(image):
    """
    灰度拉伸
    定义: 灰度拉伸, 也称对比度拉伸, 是一种简单的线性点运算.
    作用: 扩展图像的直方图, 使其充满整个灰度等级范围内.
    公式: A = min[f(x, y)], 最小灰度级;
         B = max[f(x, y)], 最大灰度级;
         f(x, y)为输入图像, g(x, y)为输出图像.
    缺点: 如果灰度图像中最小值A=0, 最大值B=255, 则图像没有什么改变.
    """
    # 彩色图像
    h, w, d = image.shape
    new_img = np.zeros((h, w, d), dtype=np.float32)
    A = image.min()
    B = image.max()
    print(A, B)
    for i in range(h):
        for j in range(w):
            for k in range(d):
                new_img[i, j, k] = 255.0 / (B - A) * (image[i, j, k] - A) + 0.5
    # new_img = cv2.normalize(new_img, None, 0, 255, cv2.NORM_MINMAX)
    # new_img = cv2.convertScaleAbs(new_img)
    new_img=new_img.astype(np.uint8)
    A1 = new_img.min()
    B1 = new_img.max()
    print(A1,B1)
    return new_img


if __name__ == '__main__':
    img = cv2.imread('../pic/beizi.png', 1)
    contrast_img = contrastStretchTransform(img)
    cv2.imshow('src img', img)
    cv2.imshow('contrast img', contrast_img)
    cv2.waitKey(0)


在这里插入图片描述


二、幂律(伽马)变换

伽马变换可以很好地拉伸图像的对比度, 扩展灰度级。伽马大于1,图片会变暗;伽马值小于1,图片整体变亮在这里插入图片描述

代码如下(示例):

"""
Created by HenryMa on 2020/8/24
"""

__author__ = 'HenryMa'


import math
from builtins import range, print
import numpy as np
import cv2


def gammaTransform(c, gamma, image):
    # 彩色图像
    """
    h, w, d = image.shape[0], image.shape[1], image.shape[2]
    new_img = np.zeros((h, w, d), dtype=np.float32)
    for i in range(h):
        for j in range(w):
            for k in range(d):
                new_img[i, j, k] = c*math.pow(image[i, j, k], gamma)

    cv2.normalize(new_img, new_img, 0, 255, cv2.NORM_MINMAX)
    print(new_img)
    new_img = cv2.convertScaleAbs(new_img)
    print(new_img)
    """

    # 灰度图
    h, w = image.shape[0], image.shape[1]
    new_img = np.zeros((h, w), dtype=np.float32)
    for i in range(h):
        for j in range(w):
            new_img[i, j] = c * math.pow(image[i, j], gamma)
    cv2.normalize(new_img, new_img, 0, 255, cv2.NORM_MINMAX)
    new_img = cv2.convertScaleAbs(new_img)

    return new_img


if __name__ == '__main__':
    img = cv2.imread('../pic/Fig0309(a)(washed_out_aerial_image).tif', 0)
    # gamma_img1 = gammaTransform(1, 0.6, img)
    # gamma_img2 = gammaTransform(1, 0.4, img)
    # gamma_img3 = gammaTransform(1, 0.3, img)
    gamma_img4 = gammaTransform(1, 3.0, img)
    gamma_img5 = gammaTransform(1, 4.0, img)
    gamma_img6 = gammaTransform(1, 5.0, img)
    cv2.imshow('origin', img)
    # cv2.imshow('gamma_img1', gamma_img1)
    # cv2.imshow('gamma_img2', gamma_img2)
    # cv2.imshow('gamma_img3', gamma_img3)
    cv2.imshow('gamma_img4', gamma_img4)
    cv2.imshow('gamma_img5', gamma_img5)
    cv2.imshow('gamma_img6', gamma_img6)

    cv2.waitKey(0)



三、对数变换

由于对数曲线在像素值较低的区域斜率大, 在像素值较高的区域斜率较小, 所以图像经过对数变换后, 较暗区域的对比度将有所提升. 可用于增强图像的暗部细节.

在这里插入图片描述

代码如下(示例):

"""
Created by HenryMa on 2020/8/24
"""

__author__ = 'HenryMa'


import cv2
import math
import numpy as np
from builtins import range, print


def logTransform(c, image):
    # 3通道RGB
    """
    h, w, d = image.shape[0], image.shape[1], image.shape[2]
    new_img = np.zeros((h, w, d))
    min = 255
    max = 0
    for i in range(h):
        for j in range(w):
            for k in range(d):
                new_img[i, j, k] = c * (math.log(1.0 + image[i, j, k]))

    # print(new_img)
    new_img = cv2.normalize(new_img, new_img, 0, 255, cv2.NORM_MINMAX)/255.
    print(new_img.max(), new_img.min())
    print(new_img)

    return new_img
    """

    # 灰度图
    h, w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w))
    for i in range(h):
        for j in range(w):
            new_img[i, j] = c * (math.log(1.0 + img[i, j]))

    new_img = cv2.normalize(new_img, new_img, 0, 255, cv2.NORM_MINMAX)/255.

    return new_img


if __name__ == '__main__':
    img = cv2.imread('../pic/Fig0305(a)(DFT_no_log).tif', 0)
    log_img = logTransform(1, img)
    cv2.imshow('src_img', img)
    cv2.imshow('log_img', log_img)
    cv2.waitKey(0)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于python的数字图像处理--学习笔记(三) 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9

随机推荐

  • C++实验: 运算符重载

    C 实验 运算符重载 1 实验目的 1 进一步了解运算符重载的概念与使用方法 2 掌握几种常用的运算符重载方法 3 了解转换构造函数的使用方法 4 了解在Visual C 6 0环境下进行运算符重载要注意的问题 2 实验内容 1 声明一个复
  • NET Core 3.0 AutoFac替换内置DI的新姿势

    NET Core 3 0 和 以往版本不同 替换AutoFac服务的方式有了一定的变化 在尝试着升级项目的时候出现了一些问题 原来在NET Core 2 1时候 AutoFac返回一个 IServiceProvider 参数注入到Confi
  • 剖析top命令显示的VIRT RES SHR值

    http yalung929 blog 163 com blog static 203898225201212981731971 http www fuzhijie me p 741 引 言 top命令作为Linux下最常用的性能分析工具之
  • 自然语言处理基础

    以下所有内容来自 自然语言处理 基于预训练模型的方法 1 文本的表示 利用计算机对自然语言进行处理 首先要解决语言在计算机内部的存储和计算问题 使用字符串表示计算文本的语义信息的时候 往往使用基于规则的方法 如 判断一个句子编译还是褒义 规
  • ninja: error: ‘system/bt/EventLogTags.logtags‘, needed by ‘out/target/common/obj/all-event-log-tags.

    项目场景 编译环境 ubuntu18 04 软件版本 全志SDK 安卓版本8 1 0 linux 4 9 0 问题描述 编译SDK时遇到这个问题 97 43 44 glob device Android bp ninja error sys
  • (HTML5)第一章

    HTML5秘籍 第一部分适合浏览器升级时参考 参考网址 H5API https github com Modernizr Modernizr wiki HTML5 Cross browser Polyfills 书本案例 http www
  • vue el-input表单验证禁止输入空格

    element ui 中自带的表单必填项校验输入空格时 依然能逃过验证 required true还是可以通过 需要再 在v model 加上 trim 来禁止输入空格字符 加上之后则不能输入空格
  • 唐老师讲运算放大器(第五讲)——运放的应用

    一 常见运放的应用 二 运放用于电源降压 图示的D1为2 5V稳压管 若VIN 12V 那么运放的同相输入端为2 5V 又虚短可知 反向输入端的电压也为2 5V 那么Rfb2和Rfb1中间节点的电压为2 5V 此时 有运算放大器的性质可知
  • 知识蒸馏 (一) 综述

    一 综述 Knowledge Distillation A Survey 2021 IJCV Knowledge Distillation and Student Teacher Learning for Visual Intelligen
  • 《C和指针》笔记29:数组名和指针

    看下面的代码 int b 10 b 4 的类型是整型 但b的类型又是什么 它所表示的又是什么 一个合乎逻辑的答案是它表示整个数组 但事实并非如此 在C中 在几乎所有使用数组名的表达式中 数组名的值是一个指针常量 也就是数组第1个元素的地址
  • 斐波那契数列求和--C语言

    include
  • 服务器net0显示linkdown,某局点S10500交换机设备接口up/down的trap中没显示端口号信息...

    某客户使用我司S10500系列交换机 在使用过程中 用户配置了SNMP网管服务器 同时将设备的告警信息发送给网管服务器 在使用过程中发现 部分设备的接口变化的告警信息中没有具体接口号相关信息 只有接口索引值 如下为客户现场S10500交换机
  • 【Unity项目】登录界面

    数据库 登录时验证用户名和密码 使用MySQL数据库管理数据 类中的主要方法也都是使用SQL语句完成 类中还提供两个接口 一个通过username获取UserInfo 一个是直接获取到排行榜 数据库连接类 using System usin
  • Java中的Thread类

    目录 一 什么是Thread类 二 Thread类的基本用法 三 线程的并发执行 一 什么是Thread类 在java标准库中 提供了一个Thread类 用来表示 操作线程 Thread类可以视为是Java标准库提供的API Java是支持
  • img图片在限定尺寸下等比缩放;点击查看原图

    一 图片等比缩放 效果 html div class row img src div div class row div 查看原图 div div css 对img外层div尺寸限制 img长宽自适应 imgbox max width 10
  • Vue脚手架

    安装 前提 Node js安装 打开想要建脚手架的文件夹 把文件夹的地址改为cmd打开终端输入以下代码 1 执行npm install g vue cli安装脚手架 2 安装完成后 可以使用vue version 3 我们测试下 在桌面创建
  • 微软网盘onedrive

    将微软网盘 做成一个共享网站 好处就是可以分享大文件 而且还不限制下载速度 如果你受够了百度网盘的限速 可以试试这个 来看看常见的几款Onedrive网盘程序 1 OneIndex 第一个微软网盘分享程序 php编写 兼容性好 我在用 作者
  • Qt鼠标事件

    新建桌面应用程序testMouseEvent 类名MouseEvent 基类QMainWindow 通过重写鼠标事件达到跟踪鼠标位置的效果 添加2个标签做转态及位置更新用 重写鼠标事件 mouseevent h ifndef MOUSEEV
  • 早早踏入刷脸支付市场的人收获颇丰

    支付行业是永远不会萧条的行业 因为只要市场上存在交易 有资金流通就需要支付工具的支撑 不仅如此 支付行业的收入十分稳定 它产生的利润不会受商品价位变化的周期性影响 无论商家经营好坏 它的利润都是保持不变的 所以支付行业对于一些追求持续稳定利
  • 基于python的数字图像处理--学习笔记(三)

    基于python的数字图像处理 学习笔记 三 前言 一 灰度拉伸 二 幂律 伽马 变换 三 对数变换 前言 进入冈萨雷斯的第三章内容 并用python实现功能 我更改了代码源 之前找到太烂了 代码全是错 现在使用的代码很清晰 功能也很全 一