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

#图像处理

图形处理入门一

      • 1.图像处理的基本知识
      • 2.OpenCV入门详解

本文学习书籍为华为云的《从零到壹•Python图像处理及识别》,写博客的目的是为了记录自己的学习过程,其中会参考和借鉴其他博主的内容,如有侵权请及时联系我,我会及时删除;书本链接:https://bbs.huaweicloud.com/blogs/336932

1.图像处理的基本知识

图像都是由像素构成,像素表示为图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值。
图像通常分为二值图像、灰度图像和彩色图像,如下图所示;二值图像非黑即白(白色像素为255,黑色像素为0)。灰度图像是指每个像素的信息由一个量化的灰度级来描述的图像,没有彩色信息。彩色图像是 RGB 图像,RGB 表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道(彩色图可以看作三维的矩阵)。
在这里插入图片描述

2.OpenCV入门详解

使用OpenCV要安装相关的包,在控制台输(pip install opencv-python),下面将介绍 OpenCV 中常见的数据类型,包括点 Point类、颜色 Scalar 类、尺寸 Size 类、矩形 Rect 类、矩阵 Mat 类。
(1)点Point(表示二维坐标系中的点,含X和Y)

point_list=[(110,110),(130,160)] #一个列表两个点

(2)颜色(包含四个元素的数组,设置像素值 RGB 三通道,第四个参数可忽略)

(3)尺寸Size(它和 Point 相似,主要成员包括 height 和 width)

width,height=img.shape

(4)矩阵Rect【Rect 类称为矩形类,包含 Point类的成员 x 和 y(代表矩形左上角的坐标)和 Size 类的成员 width 和 height(代表矩形的大小)】

#OpenCV 示例
Rect rect = rect1 & rect2; #求两矩形交集
Rect rect = rect1 | rect2; #求两矩形并集
Rect rectShift = rect + point; #矩形平移
Rect rect = rect1 + size; #矩形缩放
#Python 示例
cv2.rectangle(img, (20,20), (150,250), (255,0,0), 2)

(5)矩阵Mat(通用的矩阵类,用来创建和操作多维矩阵)

#OpenCV 示例
Mat M(3,2, CV_8UC3, Scalar(0,0,255));
#Python 示例
np.zeros((256,256,3), np.uint8)

图像的读取等操作-使用cv2

import cv2
#读取图片
img=cv2.imread("apple.jpg")
#显示图片
cv2.imshow("demo",img) #demo为显示图片是的名称
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
#无限期等待输入
k=cv2.waitKey(0)
#如果输入Esc按键退出
if k==27:
	cv2.destoryAllWindows()

图像的展示等操作-借助NumPy/Matplotlib

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img1=cv2.imread("lena.png")
img1=cv2.cvtColor(img1,cv2.COLOR_BGR@RGB)#原彩展示
img2=cv2.imread("people.png")
img2=cv2.cvtColor(img2,cv2.COLOR_BGR@RGB)
img3=cv2.imread("flower.jpg")
img3=cv2.cvtColor(img3,cv2.COLOR_BGR@RGB)
img4=cv2.imread("huawei.png")
img4=cv2.cvtColor(img4,cv2.COLOR_BGR@RGB)
#展示四张图
#plt.subplot(2,2)表示生成 2×2 张子图
titles=['lena','people','flower','huawei']
images=[img1,img2,img3,img4]
for i in range(4):
	plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
	plt.title(titles[i])
	plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述
OpenCV像素处理
OpenCV 中读取图像的像素值可以直接通过遍历图像的位置实现,如果是灰度图像则返回其灰度值,如果是彩色图像则返回蓝色(B)、绿色(G)、红色(G)三个分量值。

img=cv2.imread("lena.png")
#读取像素
test=img[88,142]
#修改像素
img[88,142]=[255,255,255]
#分别获取BGR通道像素
blue=img[88,142,0]
green=img[88,142,1]
red=img[88,142,2]
#将 100 到 200 行、150 到 250 列的像素区域设置为白色255的效果
img[100:200,150:250]=[255,255,255]
cv2.imshow('demo',img)
#等待展示
cv2.waitKey(0)
cv2.destoryAllWindows()

在这里插入图片描述
NumPy像素处理(NumPy 是 Python 提供的数值计算扩展包,拥有高效的处理函数和数值编程工具,Array 是 NumPy 库中最基础的数据结构,表示数组

#NumPy 读取像素调用 item()函数实现,在numpy下图片是一个二维数组
img=cv2.imread('lena.png')
print(type(img))
#Numpy读取像素
print(img.item(78,100,0)
print(img.item(78,100,1)
print(img.item(78,100,2)
#Numpy修改像素
img.itemset((78,100,0),100)
img.itemset((78,100,1),100)
img.itemset((78,100,2),100)

OpenCV创建图像(需要numpy库函数实现)
如下述代码,调用 np.zeros()函数创建空图像,
创建的新图像使用 Numpy 数组的属性来表示图像的尺寸和通道信息,其中参数 img.shape 表示原始图像的形状,np.uint8 表示类型。

img=cv2.imread('lena.png')
#创建空图像,默认0全黑
emptyImage=np.zeros(img.shape,np.uint8)
#img.shape 为(500, 300, 3),它表示 500×300 像素的图像,3 表示这是一个 RGB 图像
#显示图像
cv2.imshow=np.zeros(img.shape,np.unit8)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

OpenCV复制图像

#复制原有图像来获取一幅新图像,可以调用 copy()函数实现
#读取图像
img=cv2.imread('lena.png')
#创建空图像,默认0全黑
emptyImage=np.zeros(img.shape,np.uint8)
#复制图像
emptyImage2 = img.copy()
#显示图像
cv2.imshow("Demo1", img)
cv2.imshow("Demo2", emptyImage)
cv2.imshow("Demo3", emptyImage2)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
OpenCV保存图像
retval = imwrite(filename, img[, params])

  • filename 表示要保存的路径及文件名
  • img 表示图像矩阵
  • params 表示特定格式保存的参数编码,默认值为空。对于 JPEG 图片,该参数(cv2.IMWRITE_JPEG_QUALITY)表示图像的质量,用 0-100 的整数表示,默认值为 95。对于 PNG 图片,该参数
    (cv2.IMWRITE_PNG_COMPRESSION)表示的是压缩级别,从 0 到 9,压缩级别越高,图像尺寸越小,默认级别为 3。对于 PPM、PGM 、 PBM 图 片 , 该 参 数 表 示 一 个 二 进 制 格 式 的 标 志
    (cv2.IMWRITE_PXM_BINARY)。注意,该类型为 Long,必须转换成 int。
import cv2
import numpy as np
img=cv2.imread('lena.png')
#显示图片
cv2.imshow('demo',img)
#保存图片jpg/png参数
cv2.imwrite('det1.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY),5])
cv2.imwrite("dst2.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100]) 
cv2.imwrite("dst3.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0]) 
cv2.imwrite("dst4.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

在这里插入图片描述

相关文章:

  • 【Linux_】常见指令(二)
  • C++类和对象中
  • C++知识总结(内附超详细知识框架图)
  • Windows取证——学习笔记
  • 『Android基础入门』ViewPager与Fragment结合实现多页面滑动
  • 【电子技术基础(精华版)】二极管的基础知识
  • 行为识别系统 (一) --- Yolov7行人检测实例化
  • 前端:收集15个非常实用的JS代码,值得收藏
  • Swin Transformer v2实战:使用Swin Transformer v2实现图像分类(一)
  • Mysql权限
  • 微信小程序开发实战(SM周期及WXS脚本)
  • 实训任务1:Linux基本操作
  • C++11新特性精讲(多线程除外)
  • SpringCloud——Ribbon
  • 2022 华为杯数学建模研赛思路分享
  • [Vue CLI 3] 配置解析之 css.extract
  • 【知识碎片】第三方登录弹窗效果
  • bootstrap创建登录注册页面
  • ES6简单总结(搭配简单的讲解和小案例)
  • java2019面试题北京
  • JSDuck 与 AngularJS 融合技巧
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • maya建模与骨骼动画快速实现人工鱼
  • mongodb--安装和初步使用教程
  • nfs客户端进程变D,延伸linux的lock
  • Redis 中的布隆过滤器
  • 初识 beanstalkd
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从伪并行的 Python 多线程说起
  • 分享几个不错的工具
  • 基于HAProxy的高性能缓存服务器nuster
  • 数据科学 第 3 章 11 字符串处理
  • 为什么要用IPython/Jupyter?
  • 运行时添加log4j2的appender
  • 追踪解析 FutureTask 源码
  • !$boo在php中什么意思,php前戏
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (2)(2.10) LTM telemetry
  • (4)(4.6) Triducer
  • (6)设计一个TimeMap
  • (LeetCode 49)Anagrams
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 版本不支持的问题
  • .net Signalr 使用笔记
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @property python知乎_Python3基础之:property
  • @WebServiceClient注解,wsdlLocation 可配置
  • @软考考生,这份软考高分攻略你须知道
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [AIGC] Redis基础命令集详细介绍