图像简单运算

news2024/9/26 3:22:16

  图像运算是以图像为单位对图像进行数学操作,运算对象以像素点为基本单位,运算结果为一幅灰度分布与原图像不同的新图像。

算术运算与逻辑运算

  算术运算与逻辑运算中每次只涉及一个空间像素的位置,所以可以”原地操作“(在(x,y)位置做一个算术运算或逻辑运算的结果可以存在其中一个图像的相应位置,因为那个位置在其后运算中不会再使用)。两幅图像f(x,y)和h(x,y)算术或逻辑运算结果是g(x,y),可直接将g(x,y)覆盖f(x,y)或h(x,y)。

import matplotlib.font_manager as fm
from skimage import io
from matplotlib import pyplot as plt

im1 = io.imread("K.png")
im2 = io.imread("Q.png")
f1 = fm.FontProperties('simhei', size=12)  # 设置字体
im_minus = im1 - im2
im_plus = im1 + im2

plt.subplot(1, 4, 1)
plt.title('替身使者', fontproperties=f1)
plt.imshow(im1)

plt.subplot(1, 4, 2)
plt.title('替身', fontproperties=f1)
plt.imshow(im2)
plt.subplot(1, 4, 3)
plt.title('相减', fontproperties=f1)
plt.imshow(im_minus)
plt.subplot(1, 4, 4)
plt.title('相加', fontproperties=f1)
plt.imshow(im_plus)

plt.show()

 为了方便演示这里选取了相同像素属性的图片,长宽相同。

点运算

  点运算只涉及一幅原图像,运算对象是输入图像像素的灰度值。点运算也称灰度变换,且不会改变图像内空间的关系。若输入图像为A(x,y),输出图像为B(x,y)表示。点运算可表示B(x,y)=TA(x,y)。

  点运算可分为线性点运算和非线性点运算。线性点运算原值和目标值通过线性方程来完成转换(灰度调整,图像反色)。非线性点运算对应非线性映射函数(灰度幂次变换,灰度对数变换等)

  幂次变换又称伽马变换,数学形式:t=c*s^{\gamma },其中c和\gamma是常数,s代表图像像数值,t代表变换后的像素值。\gamma<1提高灰度级,正比函数上方,使图像变亮,\gamma>1降低灰度级,正比函数下方,图像变暗。c=1,不同\gamma值对应幂次变换函数如图。

  skimage的exposure模块中包含幂次变换的函数adjust_gamma,可以对图像进行幂次变换。

from skimage import io,exposure
from matplotlib import pyplot as plt
#读入图像
img=io.imread("Jo.jpg")
#计算gamma不同值时的图像
img1=exposure.adjust_gamma(img,0.2)
img2=exposure.adjust_gamma(img,0.67)
img3=exposure.adjust_gamma(img,25)
plt.subplot(2,2,1)
plt.title('gamma=1')
plt.imshow(img)
plt.subplot(2,2,2)
plt.title('gamma=0.2')
plt.imshow(img1)
plt.subplot(2,2,3)
plt.title('gamma=0.67')
plt.imshow(img2)
plt.subplot(2,2,4)
plt.title('gamma=25')
plt.imshow(img3)
plt.show()

 图像直方图

  

  在统计学中,直方图(histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量,以长条图(bar)的形式具体表现。因为直方图的长度及宽度很适合用来表现数量上的变化,所以较容易解读差异小的数值。

直方图是品质管理七大工具之一。

颜色直方图可分为:

  全局颜色直方图:反映的是图像中颜色的组成分布,即出现了哪些颜色以及各种颜色出现的概率,Swain 和 Ballard最先提出了使用颜色直方图作为图像颜色特征的表示方法。他们还指出:颜色直方图相对于图像的以观察轴为轴心的旋转以及幅度不大的平移和缩放等几何变换是不敏感的,颜色直方图对于图像质量的变化(如模糊)也不甚敏感。颜色直方图的这种特性使得它比较适合于检索图像的全局颜色相似性的场合,即通过比较颜色直方图的差异来衡量两幅图像在颜色全局分布上的差异。

  累加颜色直方图:当图像中的特征并不能取遍所有可取值时,统计直方图中会出现一些零值。这些零值的出现会对相似性度量的计算带来影响,从而使得相似性度量并不能正确反映图像之间的颜色差别。为解决这个问题,在全局直方图的基础上,Stricker和Orengo进一步提出了使用“累加颜色直方图”的概念。在累加直方图中,相邻颜色在频数上是相关的。相比一般直方图,虽然累加直方图的存储量和计算量有很小的增加,但是累加直方图消除了一般直方图中常见的零值,也克服了一般直方图量化过细过粗检索效果都会下降的缺陷。

  主色调直方图:一幅图像中,往往少数几种颜色就涵盖了图像的大多数像素,而且不同颜色在图像中出现概率不同,可以通过统计图像中各种颜色出现的概率选出最频繁出现的几种颜色作为主色。使用主色并不会降低颜色匹配的效果,因为颜色直方图出现频率低的颜色往往不是图像主要内容,从某种程度而言,是对图像内容表示的一种噪声。

from skimage import io,exposure
from matplotlib import pyplot as plt
#读入图像
img=io.imread("Jo.jpg")
hist_r=exposure.histogram(img[:,:,0],nbins=256)
hist_g=exposure.histogram(img[:,:,1],nbins=256)
hist_b=exposure.histogram(img[:,:,2],nbins=256)

  使用histogram()计算直方图。

  计算颜色直方图需要将颜色空间划分为若干小的颜色区间,每个小区间能成为直方图的一个bin。这个过程称为颜色量化。计算颜色落在每个小区间内像素数量可以得到颜色直方图。设一幅彩色图像包含N个像素,像素的颜色被量化成L种不同颜色:

H={h[1],h[2],.....h[L]}       

  h[k]=n_{k}/N

n_{k}表示第k种颜色对应像素数量

    直方图图像处理常见应用包括:直方图均衡化,直方图拉伸,以及直方图匹配。

  直方图均衡化:

from skimage import exposure, io,data
import matplotlib.pyplot as plt

img=data.moon()
plt.figure("hist", figsize=(8, 8))
arr = img.flatten()
plt.subplot(221)
plt.imshow(img, plt.cm.gray)
plt.subplot(222)
plt.hist(arr, bins=256,edgecolor='None',facecolor='red')
img1 = exposure.equalize_hist(img)  # 原始图像直方图
arr1 = img1.flatten()
plt.subplot(223)
plt.imshow(img1, plt.cm.gray)
plt.subplot(224)
plt.hist(arr1, bins=256,edgecolor='None',facecolor='red')
plt.show()

 均衡化后图像更容易进行目标分辨.

图像卷积 

  图像卷积操作就是图像空间域滤波的基础运算,就是循环将图像和卷积核逐个元素相乘再求和,得到的卷积后图像过程。

  假设卷积核使用K表示,大小为(m*n);原始图像表示为S,大小为(M*N),结果图像表示T

T(x,y)=\sum_{i=-a}^{a}\sum_{j=-b}^{b}K(i,j)*S(x+i,y+j)

m=2*a+1,n=2*b+1

  卷积操作中,卷积核在原始图像中从上到下,从左到右滑动扫描,每次扫描使用卷积核与扫描覆盖区域图像做一次卷积运算,然后在移动到下一个位置进行扫描,直到扫描完毕。

import numpy as np
from skimage import io, data


def mat_conv(arr, kernel):  # 数组和卷积核
    n = len(kernel)
    ans = 0
    for i in range(n):
        for j in range(n):
            ans += arr[i, j] * float(kernel[i, j])
    return ans


def conv_2d(img, kernel):
    n = len(kernel)
    img1 = np.zeros((img.shape[0] + 2 * (n - 1), img.shape[1] + 2 * (n - 1)))
    img1[(n - 1):(n + img.shape[0] - 1), (n - 1):(n + img.shape[1] - 1)] = img
    img2 = np.zeros((img1.shape[0] - n + 1, img1.shape[1] - n + 1))
    for i in range(img1.shape[0] - n + 1):
        for j in range(img1.shape[1] - n + 1):
            tmp = img1[i:i + n, j:j + n]
            img2[i, j] = mat_conv(tmp, kernel)
    new_img = img2[(n - 1):(n + img.shape[0] - 1), (n - 1):(n + img.shape[1] - 1)]
    return new_img


kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype=int)
img = data.moon()
io.imshow(img)
io.show()
new = conv_2d(img, kernel)
io.imshow(new)
io.show()

原图:

卷积后:

 灰度反转

from skimage import io


def my_gray(img):
    img = 255 - img
    return img


im1 = io.imread("P1.jpg")
io.imshow(im1)
io.show()
im2 = my_gray(im1)
io.imshow(im2)
io.show()

反转:

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

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

相关文章

【微服务笔记02】微服务组件之Eureka常见的几个配置属性及其常见的几个概念

这篇文章&#xff0c;主要介绍微服务组件中Eureka常见的几个配置属性及其常见的几个概念【源代码地址】。 目录 一、Eureka常见配置属性 1.1、instance配置项 1.2、client配置项 1.3、server配置项 二、eureka常见概念 2.1、服务注册 2.2、服务发现 2.3、服务续约 2.4…

CSS常见标签知识回顾

学前端的一点css笔记&#xff0c;参考的是黑马程序员pink老师的教程。 一.行内元素 1.一行可以显示多个 2.宽度核高度默认由内容撑开 3.不可以设置宽高 代表标签&#xff1a; a、span、b、ui、s、strong、ins、em、del 二、行内块元素 1.一行可以显示多个 2.可以设置宽高…

回顾2022年总结

文章目录前言这一年感悟感想成绩新的一年期许前言 2022过的好快&#xff0c;接着我对自己这一年的所做的事情来进行一个汇总和感悟感想总结&#xff01; 所有博客文件目录索引&#xff1a;博客目录索引(持续更新) 这一年 月份做了什么事1转本备考、Java技术(netty一套课程、…

VisionMaster应用实例——识别锁付孔位

项目背景&#xff1a;相机对法兰盘表面进行拍照&#xff0c;获取法兰盘上16个孔位的位置&#xff0c;通过VisionMaster进行TCP通信&#xff0c;将位置信息发送给机械臂&#xff0c;对这16孔位的螺丝进行拧紧&#xff0c;同时需要根据十字锁付的特点。 思路分析&#xff1a; 1.方…

[oeasy]python0036_牛说_cowsay_小动物说话_asciiart_figlet_lolcat_管道(祝大家新年快乐~)

牛说(cowsay) 回忆上次内容 上次我们研究了shell脚本的编程 并且在shell中实现了 循环语句延迟命令清屏命令python命令figlet命令还能整点什么呢&#xff1f;&#x1f914;还想要让小动物报时 cowsay 首先要安装 cowsay sudo apt install cowsay 装完之后 cow 就可以 say 了…

人工智能-逻辑回归

1&#xff0c;逻辑回归介绍 逻辑回归&#xff1a;分类模型 应用场景&#xff1a;广告点击率、是否垃圾邮件 逻辑回归主要用于解决二分类问题 输入&#xff1a; 逻辑回归的输入&#xff1a;线性回归的结果 激活函数&#xff1a;sigmoid函数 回归的结果输入到sigmoid函数中 输…

UE5笔记【十四】漂流者游戏制作【一】地形材质准备

针对游戏的剧情设计&#xff1a;角色流落荒岛&#xff0c;寻找食物和水&#xff0c;等待救援。只有按时找到才能存活。否则游戏失败了。 新建一个第三人称游戏。可以将项目名称命名为《CastAway》 启动Landmass插件 然后启用Water插件。 然后删除场景中不需要的东西。保留荒岛…

DoIP协议从入门到精通——诊断通信

DoIP(Diagnostic on IP)是基于IP(车载通信总线介质)为实现诊断诊断通信搭建通信桥梁的过程。从车辆连接-车辆声明-激活通信,都在前面几篇文章有过分享: 在专栏中可以找到文章! 如下述将DoIP协议内容映射到计算机OSI七层通信模型中,其作用就是将物理层接收到的收据,准…

(十) Docker微服务实战

Docker微服务实战一、IDEA新建一个普通微服务模块二、通过dockerfile发布微服务部署到docker容器2.1、打包模块2.2、编写 Dockerfile以及上传jar包2.3、构建镜像2.4、运行容器一、IDEA新建一个普通微服务模块 建Module docker_boot Pom文件 <?xml version"1.0" e…

2022年技术自媒体经验分享 —— 开始尝试认真做 B站 的一年后的复盘

文章目录前言一、回顾过去1、进驻B站2、进驻知识星球3、做全网最强的算法星球4、付费是道砍二、星球简介1、星主介绍2、星球简介三、星球内容1、九日集训2、付费专栏 - 免费阅读3、每月算法集训4、每日作业5、个人规划6、更优质的朋友圈7、向我提问 - 深思熟虑你的问题8、持续创…

微机原理真题错题整理2018,2019年

目录 2017年 选择 填空题 2018年 选择 填空题 编程题 2017年 选择 1:若一SRAM芯片的容量是10248位&#xff0c;除电源和接地外该芯片的其他引脚最少应为&#xff08;&#xff09; A:23 B:22 C:21 D:20 10242^1010根地址线 8位8根数据线 …

【SV】为什么需要异步复位?同步输入/异步输入、异步复位/同步复位(bad)、异步复位同步释放、同步系统/异步系统

【SV】为什么需要异步复位&#xff1f;同步输入/异步输入、异步复位/同步复位&#xff08;bad&#xff09;、同步系统/异步系统 1. 同步输入/异步输入&#xff08;synchronous and asynchronous inputs in sequential system&#xff09;为什么需要异步复位&#xff1f;1.1 异步…

k8s之基本环境准备

写在前面 本文看下学习k8s需要的基础环境&#xff0c;包括运行环境&#xff0c;docker等。 1&#xff1a;准备linux运行环境 环境&#xff1a;win10 虚拟化工具&#xff1a;VMware-workstation-full-15.1.0 linux&#xff1a;ubuntu-22.04.1-desktop-amd64.iso 。 安装完毕…

6)Django Cookies/Session,中间件,Nginx+uwsgi安装配置

目录 一 Django cookie 与 session Cookies Django 中 Cookie 的语法 Session(保存在服务端的键值对) 工作原理 实例 二 Django中间件 自定义中间件 自定义中间件类的方法 process_request 方法 process_response process_view process_exception 三 Django Nginxu…

【值得收藏】机器学习实战项目汇总(初级、中级、高级)

大家都知道&#xff0c;教科书上所学与实际操作还是有出入的&#xff0c;那关于机器学习有什么好的项目可以实操吗&#xff1f; 这次给大家分享一个涵盖面向初学者&#xff0c;中级专家和专家的23种机器学习项目创意&#xff0c;以获取有关该增长技术的真实经验。这些机器学习…

opencv-python常用函数解析及参数介绍(三)——图像滤波

图像滤波前言1.制作噪声生成椒盐噪声生成高斯噪声2.滤波均值滤波框滤波高斯滤波中值滤波总结前言 很多时候我们能拿到的图片并不是十分干净&#xff0c;有时会有一些噪声&#xff0c;这时我们就应该采用滤波的方式对他进行处理&#xff0c;本文将在一张干净的图片上生成噪声并…

OpenWrt19.07设置mac地址为芯片内置出厂地址

目录7628芯片的mac地址openwrt源码修改验证关联问题随机地址在何处生成mac地址生成时机最近发现所使用的openwrt19.07系统在htlk7628核心板上运行时&#xff0c;一旦恢复出厂设置或者重刷固件后对应的mac地址就会改变&#xff0c;猜测系统生成mac地址方式并非使用了芯片内部的m…

复习篇【类的构造方法与代码块的执行】

复习篇【类的构造方法与代码块的执行】&#x1f34e;一.构造方法&#x1f352;1.1 基本语法&#x1f352;1.2 this关键字&#x1f34e;二.代码块执行&#x1f352;2.1 什么是代码块&#x1f352;2.2 普通代码块&#x1f352;2.3 构造代码块&#x1f352;2.4 静态代码块&#x1…

VBScript (vbs) 脚本实例

欢迎小伙伴的点评✨✨ 文章目录前言一、vbs是什么&#xff1f;二、简单使用VBScript实例2.1、msgbox实例2.2、VBScript 的变量三、VBScript 输出文本及键盘按键到cmd3.1、cmd的FOR循环3.2、cmd的ping指令3.1、VBScript 批量输出到cmd命令代码实例四、总结前言 本文将会给大家带…

(二十九)Vue之回顾本地存储webStorage

文章目录webStorageLocalStoragesessionStorage改造TodoList案例为本地存储Vue学习目录 上一篇&#xff1a;&#xff08;二十八&#xff09;Vue之组件化编码流程 webStorage 使用HTML5可以在本地存储用户的浏览数据。 早些时候,本地存储使用的是 cookie。但是Web 存储需要更…