The First :使用Anaconda+pycharm学习图像处理

目录

#图像操作

#图像的基本知识和操作。

#图像基础

#图像的读取与写入

#图像显示

#图像截取

 #获取彩色图像通道

 #通道保留

 #边界填充

#图像融合与类型转换

#图像类型转换

#视频读取与导入


#图像操作

#图像的基本知识和操作。

参考以下文章:  图像处理基础操作一(几何变换、平滑处理、形态学操作)_Asia-Lee的博客-CSDN博客_图像处理基础

#图像基础

图像都是由像素构成。这些像素都有一个明确的位置和被分配的色彩数值,这些小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

图像通常包括二值图像、灰度图像和彩色图像,目前我只接触到彩色图像和灰度图像,二值图像我还没学习到,所以我先保留参考中的二值图像定义,只以自己的理解来解释灰度图像和彩色图像:

  • 二值图像:二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。
  • 灰度图像:灰度图像包括黑白灰三种色,而又把灰色分为0-255不同的值,图像的灰度化是实现图像预处理的最基本形式。(那么问题是:为什么要对彩色图像进行灰度处理?
  • 彩色图像:彩色图像是RGB图像,RGB表示红(red)、绿(green)、蓝(blue)三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。(但计算机读取图像似乎都是以BGR的形式读取的,所以在运用某些函数的时候,似乎都会使用BGR来读取图像然后再转为RGB)

#图像的读取与写入

因为图像的种类有很多种,所以相应的图像读入的方法也会有很多,参阅资料有以下读入方法:

img = cv2.imread(文件名,[参数]):

#简单读取
img=cv2.imread("Butterfly.png")
#UNCHANGED表示图片读取后不能改变
img_unchanged=cv2.imread(img,cv2.IMREAD_UNCHANGED) 
#GRAYSCALE表示对图片进行灰度处理
img_gray=cv2.imread(img,cv2.IMREAD_GRAYSCALE)
#COLOR表示读入彩色图片
img_color=(img,cv2.IMREAD_COLOR)
#表示图像通道BGR转成RGB
img_rgb=cv2.imread(img,cv2.COLOR_BGR2RGB)
#shape获取图像尺寸
img.shape
#改变图像的shape,使用cv2.resize
img=cv2.resize(img,(500,500))

EX:以下在jupyter notebook中实操,其中无参数和使用IMREAD_GRAYSCALE、以及使用img.shape获取图像尺寸的栗子:

#图像显示

使用cv.imshow创建图像显示窗口:

#图像显示,可以创建多窗口,‘’为窗口命名
cv2.imshow('image',img)
#等待时间,0表示任意键终止,毫秒级
cv2.waitKey(0)
cv2.destroyAllWindows()

 cv2.waitKey(delay):键盘绑定函数,共一个参数,表示等待毫秒数,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

#图像截取

ROI(Region of Interest)表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。比如可以通过像素矩阵直接获取ROI区域,如img[200:400, 200:400]。

import cv2
#读取图像,并且赋值给img
img = cv2.imread('Buterfly.png')
#利用矩阵截取ROI,格式为 变量 = 图像 [h,w]h为竖列200个像素点,w为横排200个像素点。
img_new=img[0:100,0:200]
#创建窗口。
cv_show('Butterfly',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 #获取彩色图像通道

 #通道保留

图片拷贝于参考资料(我实操的时候用的自己的照片我不好意思(doge))

 #边界填充

#指定上下左右填充的大小
top_size,bottom_size,left_size,right_size = (50,50,50,50)
#不同的填充方法
#BORDER_RELIOCATE:复制最边缘的像素
replicate=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
#BORDER_REFLECT:反射法,对图像中所选的像素两边进行复制,ex:hgfedcba|abcdefgh|hgfedcba  即为←丨¥丨→
reflect =cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
#BORDER_REFLECT_101:101反射法,以最边缘像素为轴对称复制,ex:hgfedcb/abcdefgh/gfedcba 即上面那种方法但不包含两边界
reflect101 =cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
#BORDER_WRAP:外包装法,去掉边缘像素按原顺序输出,ex:cdefgh/abcdefgh/abcedfg
wrap = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
#BORDER_CONSTANT:常量法,常数值填充
constant =cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)

#图像融合与类型转换

参阅资料:

图像融合通常是指将2张或2张以上的图像信息融合到1张图像上,融合的图像含有更多的信息,能够更方便人们观察或计算机处理。通过图像融合可以将两张不清晰的图像融合得到更清晰的图。图像融合是在图像加法的基础上增加了系数和亮度调节量。

import cv2  
# opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np
 
img_butterfuly=cv2.imread('butterfuly.jpg')
img_aphoto=cv2.imread('aphoto.jpg')
print(img_butterfuly.shape) 
print(img_aphoto.shape)  
img_dog = cv2.resize(img_aphoto, (500, 414))
print(img_butterfuly.shape)  #(414, 500, 3)
#使得图像x轴变化为原来的三倍,y轴不变,即fx=3, fy=1,表示对图像的x轴进行变化
res = cv2.resize(img, (0, 0), fx=3, fy=1)
img_1 = img+10  
#对三个通道像素点进行加10操作
img_new=img2+img1
#将两张图片进行相加操作, 如果大于255,就使用256进行约分
img_add=cv2.add(img1, img2) 
#使用cv2.add对两个照片进行加和, 如果加和值大于255,就使用255表示
res = cv2.addWeighted(img2, 0.4, img1, 0.6, 0)
#将两个图片进行重叠
plt.imshow(res)

#图像类型转换

参考资料如上文。

图像类型转换是指将一种类型转换为另一种类型,比如彩色图像转换为灰度图像、BGR图像转换为RGB图像。

图像类型转化:cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
颜色通道转化:cv2.cvtColor(img, cv2.COLOR_BGR2RGB

#视频读取与导入

在我的理解上,视频的读取相当于将视频切成若干帧,然后利用循环显示每一帧,李子如下

猜你喜欢

转载自blog.csdn.net/Crabfishhhhh/article/details/127326018