图像处理之图像灰度化

news2024/11/27 6:42:52

图像灰度化

   将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。

彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万 (255255255)的颜色的变化范用。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像(R=G=B),其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。

图像灰度化常用方法

  • 平均值法
  • 最大值法
  • 加权平均法

平均值法

取R、G、B分量中的均值,公式如下:
G r a y ( x , y ) = ( R ( x , y ) + G ( x , y ) + B ( x , y ) ) / 3 Gray(x,y)=(R(x,y)+G(x,y)+B(x,y))/3 Gray(x,y)=(R(x,y)+G(x,y)+B(x,y))/3

def grayByaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
            grayimg[i, j] = np.uint8(gray)
    return grayimg

最大值法

取R、G、B分量中的最大值,公式如下:
G r a y ( x , y ) = m a x ( R ( x , y ) + G ( x , y ) + B ( x , y ) ) Gray(x,y)=max(R(x,y)+G(x,y)+B(x,y)) Gray(x,y)=max(R(x,y)+G(x,y)+B(x,y))

def grayByaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
            grayimg[i, j] = np.uint8(gray)
    return grayimg

加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。公式如下:
G r a y ( x , y ) = 0.11 R ( x , y ) + 0.59 G ( x , y ) + 0.30 B ( x , y ) Gray(x,y)=0.11R(x,y)+0.59G(x,y)+0.30B(x,y) Gray(x,y)=0.11R(x,y)+0.59G(x,y)+0.30B(x,y)

def grayByWeightedaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = 0.30 * img[i, j][0] + 0.59 * img[i, j][1] + 0.11 * img[i, j][2]
            grayimg[i, j] = np.uint8(gray)
    return grayimg

三种灰度化结果如下:
在这里插入图片描述
结果分析:
三种灰度图像中,最大值法获得的灰度图较亮;加权平均值法获得的灰度图柔和,平均值获得的灰度图暗处较其他的颜色更深。

整体代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

#图像灰度化
#最大值法
def grayBymax(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = max(img[i,j][0], img[i,j][1], img[i,j][2])
            grayimg[i, j] = np.uint8(gray)
    return grayimg


def grayByaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
            grayimg[i, j] = np.uint8(gray)
    return grayimg


def grayByWeightedaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = 0.30 * img[i, j][0] + 0.59 * img[i, j][1] + 0.11 * img[i, j][2]
            grayimg[i, j] = np.uint8(gray)
    return grayimg


if __name__ == '__main__':
    img = cv2.imread('miao.jpg')
    opencv_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    grayByaverage=grayByaverage(img)
    grayBymax=grayBymax(img)
    grayByWeightedaverage=grayByWeightedaverage(img)
    # # 显示图像
    # cv2.imshow("src", img)
    # cv2.imshow("gray", opencv_gray)
    # # 等待显示
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.figure(figsize=(80, 80))
    plt.rcParams['font.sans-serif'] = [
        'FangSong']  # 支持中文标签
    fig, ax = plt.subplots(2, 2)
    ax[0, 0].imshow(imgRGB)
    ax[0, 1].imshow(grayByaverage)
    ax[1, 0].imshow(grayBymax)
    ax[1, 1].imshow(grayByWeightedaverage)
    ax[0, 0].title.set_text("原图")
    ax[0, 1].title.set_text("平均值法")
    ax[1, 0].title.set_text("最大值法")
    ax[1, 1].title.set_text("加权平均值法")
    ax[0,0].axis("off")
    ax[0,1].axis("off")
    ax[1,0].axis("off")
    ax[1,1].axis("off")
    fig.tight_layout()
    plt.savefig("gray.jpg")
    plt.show()

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

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

相关文章

分析 jsjiami.v6 代码混淆和加密技术:特点、优点和缺点

当涉及到 JavaScript 代码混淆和加密技术时,开发人员常常寻求方法来保护他们的代码免受逆向工程和未授权访问的威胁。这种技术可以增加代码的复杂性,使其难以理解和修改,同时也可以隐藏关键信息和保护数据的安全性。本文将探讨 JavaScript 代…

echarts在vue上使用模版可粘贴!!!一站式搞定以及动态数据渲染关键问题解决(附带模版)

阿丹: 之前的项目中涉及到echarts都是使用jsp写的,但是现在越来普及vue。所以使用在vue上使用echarts就成了问题。 导入相关依赖 在官网上面有说明npm安装Echarts依赖 在vue中使用Echarts 上模版!!!!!!!!!!!!使用了mounted()这个…

在使用yum时报错Loaded plugins: fastestmirror

在使用yum时报错Loaded plugins: fastestmirror 在我安装更高版本的gcc编译器时,发现了这个问题 意思是加载插件,加载后面两个插件,查阅得知其中fastestmirror是yum的一个加速插件,这个提示意思是这个插件不能使用,那么就先把他禁…

4 款非常好用的AI生成图片软件

AI生成图片最近是越来越火了,越来越多的AI生成图片工具上线。 本文就给你推荐4款非常好用的AI生成图片工具,避免你碰雷。 即时灵感 「即时灵感」是通过文字描述等方式生成精致图像的AI绘图工具。输入文字,即可将创意变为现实! …

centos7升级openssh修复安全漏洞

查看linux版本 cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core) 升级 yum update openssh -y升级openssl和openssh 下载openssl https://ftp.openssl.org/source/ 下载openssh http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ yum update openssh…

盘点spring-boot-3-jwt-security中如何使用jwt+security

目录 SecurityApplication类中 AuthenticationService register方法 authenticate方法 saveUserToken略 revokeAllUserTokens方法 refreshToken方法 ApplicationConfig Bean:UserDetailsService Bean:AuthenticationProvider Bean&#xff1a…

浅谈智能集成电力电容器的应用意义

安科瑞 华楠 摘要:该文通过智能集成电力电容器研发背景的说明,介绍该产品基于数字信号处理器(DSP)和单片机相结合的双CPU技术智能无功补偿技术,集成复合开关的过零投切与计算机智能网络模块技术,实现了现代…

语音信号的采集--电脑录音

准备条件: 1.电脑麦克风打开。(联想小新AIR2021 打开方式:点击电脑右下角“电源”,点击“麦克风打开”) 2.打开电脑自带的录音机。(电脑界面搜索框中键入“录音机”) 3.打开音乐播放软件&…

【JavaEE】Linux基本使用

Linux基本使用 文章目录 【JavaEE】Linux基本使用1. 如何获取一个Linux的环境2. 终端软件来远程登录3. Linux基本使用3.1 命令提示符3.2 ls3.3 cd3.4 pwd3.5 touch3.6 cat3.7 man3.8 echo3.9 vim3.9.1 打开文件3.9.2 编辑文件3.9.3 保存退出3.9.4 vimtutor 3.10 mkdir3.11 rm3.…

【设计模式】23种设计模式——单例模式(原理讲解+应用场景介绍+案例介绍+Java代码实现)

单例模式(Singleton) 介绍 所谓类的单例设计模式,就是采取一定的方法,保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。比如Hibernate的Sessio…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(三)SG_CopyPointsWithHierarchy

继续解析《Electric Dreams》项目中的自定义节点和子图:SG_CopyPointsWithHierarchy和PostCopyPoints-OffsetIndices 文章目录 前导文章标准组合拳SG_CopyPointsWithHierarchyPostCopyPoints-OffsetIndices使用情景Execute with ContextIteration Loop Body 小结 前…

看懂Congestion Map

往期文章链接: ​​​​​​ICC2:工具是如何平衡std cell利用率和congestion的? ICC2:使用report_placement检查floorplan ICC2:使用global route分析绕线 ICC2:congestion的解决办法

postman 自动化测试

postman 自动化测试 0、写在前面1、变量引用1.1、如何在请求体中引变量 0、写在前面 在有些时候看官方文档 比网上搜索效率要高, 比如网上搜一通还是不知道用法或者没有搜索到你想要的用法的时候。 postman官方文档 : https://learning.postman.com/docs/introduct…

从 robot 坐标系到 orb2 坐标系的变换

机器人坐标系 在机器人学和机器人导航中,通常使用右手坐标系,其定义如下: X轴:通常定义为机器人的"前"或"向前"方向。在移动机器人中,这通常是机器人行进的方向。 Y轴:在右手坐标系中,Y轴通常定义为机器人的"左"或"向左"方向。…

有趣的命令——————用shell脚本实现与电脑猜价格游戏,小朋友比较合适哟~~~

vim games.sh 输入以下内容#!/bin/bashecho "这是一个小游戏,猜价格(1--1000)" pc$(expr $RANDOM % 1000 1) cs0 while true doread -p "请输入你猜的价格:" intlet csif [ $int -gt $pc ]thenecho "价…

docker+jenkins 实现自动化部署

前期准备工作 工欲善其事必先利其器,所以前期的准备工作必须做好,那么我们要实现自动化部署,必须提前准备什么呢?哈哈哈,可能有一些小伙伴已经猜到了,我们需要一台自己的服务器,这里博主使用的…

你不会还不知道什么是企业博客吧?

企业博客是指由企业或组织创建的在线平台,主要是用于发布与其业务、产品、行业和相关主题相关的文章、信息和观点。通过企业博客可以实现促进品牌推广、客户培养和业务发展等,对于企业发展有极其重要的作用。 企业博客的目的 1.提供有关企业产品和服务的…

Pytorch基本使用—参数初始化

深度学习模型参数初始化是指在训练深度神经网络时,对网络的权重和偏置进行初始化的过程。合适的参数初始化可以加速模型的收敛,并提高模型的性能。 ✨ 1 基本介绍 在深度学习中,常用的参数初始化方法有以下几种: 零初始化&#…

SwinIR Transformer训练教程(使用自己的数据集)

使用自己的数据集训练SwinIR Transformer SwinIR Transformer图像超分辨率重建训练教程 目录 使用自己的数据集训练SwinIR Transformer一、使用MATLAB对数据集进行BICUBIC插值下采样二、使用MATLAB对数据集进行BICUBIC插值下采样三、训练3.1 下载训练源代码3.2 修改json文件3.…

Servlet文档1

Servlet 1、如何去书写一个servlet2、如何去访问一个servlet3、如何去快速创建一个servlet4、web中一些路径的访问分析5、servlet一些配置项(servletConfig)6、web项目的配置项(servletContext)servlet简介 Servlet 是sun公司提供…