当前位置: 首页 > news >正文

图像运算和图像增强一

图像运算和图像增强一

1.图像点运算之图像灰度化处理

(1)图像点运算概念
图像点运算(Point Operation)指对于一幅输入图像,将产生一幅输出图像,输出图像的每个像素点的灰度值由输入像素点决定。点运算实际上是灰度到灰度的映射过程,通过映射变换来达到增强或者减弱图像的灰度。
(2)图像灰度化处理
彩色图像包括RGB三个分量,而灰度图像就是把RGB三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度。

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

#读取原始图像
img_BGR=cv2.imread('luo.png')
img_RGB = cv2.cvtColor(img_BGR,cv2.COLOR_BGR2RGB)#BGR 转换为 RGB
img_GRAY = cv2.cvtColor(img_BGR,cv2.COLOR_BGR2GRAY) #灰度化处理
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) #BGR 转 HSV
img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) #BGR 转 YCrCb
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) #BGR 转 HLS
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) #BGR 转 XYZ
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) #BGR 转 LAB
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) #BGR 转 YUV

#调用matplotlib显示处理结果
titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV']
images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb, img_HLS, img_XYZ, img_LAB, img_YUV] 
for i in range(9):
	plt.subplot(3,3,i+1),plt.imshow(images[i[,'gray')
	plt.title(titles[i])
	plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述
(3)基于像素操作的图像灰度化处理
1.最大值灰度处理方法
灰度值=彩色图像R、G、B三个分量中的最大值,该方法灰度化处理后的灰度图亮度很高。
gray(i,j)=max(R(i,j),G(i,j),B(i,j))
2.平均灰度处理方法
3.加权平均灰度处理方法
gray(i, j) =0.30xR(i, j)+0.59xG(i, j)+0.11xB(i, j)

import cv2 
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#读取图像高度和宽度
height=img.shape[0]
width=img.shape[1]

#创建一副图像
grayimg1=np.zeros((height,width,3),np.uint8)
grayimg2=np.zeros((height,width,3),np.uint8)
grayimg3=np.zeros((height,width,3),np.uint8)

#图像灰度处理
for i in range(height):
	for j in range(width):
		#获取图像RGB最大值 gray=max(R,G,B)
		gray1=max(img[[i,j],[0]],img[i,j][1],img[i,j][2])
		#灰度值为RGB三个分量的平均值
		gray2= (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2])) / 3
		#灰度加权平均法
		gray3= 0.30 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2]
		
		#获取图像素赋值 
		grayimg1[i,j]=np.uint8(gray1)
		grayimg2[i,j]=np.uint8(gray2)
		grayimg3[i,j]=np.uint8(gray3)

		
#显示图像
cv2.imshow('src',img)
cv2.imshow('gray1',grayimg1)
cv2.imshow('gray2',grayimg2)
cv2.imshow('gray3',grayimg3)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

2.图像灰度线性变换

(1)灰度线性变换
图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。
在这里插入图片描述
当 α=1,b=0 时,保持原始图像
当 α=1,b!=0 时,图像所有的灰度值上移或下移
当 α=-1,b=255 时,原始图像的灰度值反转
当 α>1 时,输出图像的对比度增强
当 0<α<1 时,输出图像的对比度减小
当 α<0 时,原始图像暗区域变亮,亮区域变暗,图像求补
在这里插入图片描述
(2)图像灰度上移变换
通过灰度上移提升图像的亮度,由于图像的灰度值位于0至255区间之内,所以需要对灰度值进行溢出判断

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#图像灰度转换
grayimage=cv2.cvtcolor(img,cv2.COLOR_BGR2GRAY)

#获取图像高度和宽度
height=grayimage.shape[0]
width=grayimage.shape[1]
#创建一副图像
result=np.zeros((height,width,3).np.uint8)

#图像灰度上移变换 DB=DA+50
for i in range(height):
	for j in range(width):
		if(int(grayinage[i,j]+50)>255):
			gray=255
		else:
			gray=int(grayimage[i,j]+50)
		result[i,j]=np.uint8(gray)
#显示图像
cv2.imshow('Grayimage',grayimage)
cv2.imshow('Result',result)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

在这里插入图片描述
(3)图像对比度增强变换 DB=DAX1.5
图像对比度减弱变换 DB=DA×0.8
图像灰度反色变换 DB=255-DA

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#图像灰度转换
grayimage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height=grayimage.shape[0]
width=grayimage.shape[1]
#创建一副图像
result1=np.zeros((height,width,3),np.uint8)
result2=np.zeros((height,width,3),np.uint8)
result3=np.zeros((height,width,3),np.uint8)

#图像对比度增强变换 DB=DAX1.5
#图像对比度减弱变换 DB=DA×0.8
#图像灰度反色变换 DB=255-DA
for i in range(height):
	for j in range(width):
		gray2 = int(grayimage[i,j]*0.8)
		gray3 = 255 - grayimage[i,j]
		if(int(grayimage[i,j]*1.5)>255):
			gray1=255
		else:
			gray1=int(grayimage[i,j]*1.5)
		result1[i,j]=np.uint8(gray1)
		result2[i,j]=np.uint8(gray2)
#显示图像
cv2.imshow('Grayimage1',grayimage1)
cv2.imshow('Grayimage2',grayimage2)
 cv2.imshow('Grayimage3',grayimage3)
 
 #等待显示
 cv2.waitKey(0)
 cv2.destoryAllWindows()
 
		

相关文章:

  • 【C++】unordered map/set
  • 定时任务框架
  • C型9.4MM针脚距电磁阀插头
  • 【算法 | 实验8】分配最小页数(数组划分和最大值最小化问题)
  • rsync远程同步+inotify监控
  • 学会这个Python技能,就可以跟excel说再见了
  • 【漏洞复现-showdoc-文件上传】​vulfocus/showdoc-cnvd_2020_26585
  • 改进YOLOv7系列:首发结合最新Transformer视觉模型MOAT结构:交替移动卷积和注意力带来强大的Transformer视觉模型,超强的提升
  • 【jQuery案例】手风琴
  • 毕业设计 基于大数据的共享单车数据分析与可视化
  • PointNet:基于深度学习的3D点云分类和分割模型
  • 计算器的混合运算
  • HttpRunner
  • 『百日百题 · SQL篇』备战面试,坚持刷题(一)
  • 【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CentOS7简单部署NFS
  • download使用浅析
  • iOS 颜色设置看我就够了
  • JS 面试题总结
  • Markdown 语法简单说明
  • mysql外键的使用
  • node学习系列之简单文件上传
  • PHP那些事儿
  • python大佬养成计划----difflib模块
  • Vim Clutch | 面向脚踏板编程……
  • Zepto.js源码学习之二
  • 闭包--闭包作用之保存(一)
  • 编写高质量JavaScript代码之并发
  • 网页视频流m3u8/ts视频下载
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#3.3_存储_Memory
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (SpringBoot)第七章:SpringBoot日志文件
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (四)c52学习之旅-流水LED灯
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)scrum常见工具列表
  • (转)平衡树
  • .NET Core中的去虚
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net和jar包windows服务部署
  • .NET中的Exception处理(C#)
  • .ui文件相关
  • :=
  • :O)修改linux硬件时间
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 转载 ] SharePoint 资料
  • [BUUCTF]-Reverse:reverse3解析
  • [bzoj1038][ZJOI2008]瞭望塔
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue