首页 > 编程语言 >【python版CV】—图像基本操作

【python版CV】—图像基本操作

时间:2023-02-15 11:34:08浏览次数:42  
标签:... plt img python cv 基本操作 255 CV size


1、数据读取-图像

  • cv2.IMREAD_COLOR:彩色图像
  • cv2.IMREAD_GRAYSCALE:灰度图像
#输出图像函数
def cv_show(name,img):
cv.imshow(name, img)
#等待时间,毫秒级别。0表示任意键终止,1000表示1000毫秒关闭
cv.waitKey(0)
cv.destroyAllWindows()#触发条件时,关闭


src=cv.imread("E:\\Pec\\12.jpg")
#shape求图片的长、宽以及像素颜色通道(B、G、R)
#把图像转化为灰度图
img=cv.imread("E:\\Pec\\12.jpg",cv.IMREAD_GRAYSCALE)
#cv_show("input",img)
#print(img)
print(src.shape)
print(img.shape)

#图像保存
cv.imwrite('hui12.jpg',img)

2、数据读取-视频

  • cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备

说明:视频就是图像中的每一帧的静止图像的连贯。

vc=cv.VideoCapture("E:\\Pec\\ved.mp4")
#检测是否能打开
if vc.isOpened():
open,frame=vc.read() #一帧一帧的读取
else:
open=False
#读取视频,并转换为灰度视频
while open:
ret,frame=vc.read()
if frame is None:
break
if ret==True:
gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
cv.imshow('result',gray)
if cv.waitKey(10) & 0xFF==27:
break
vc.release()
cv.destroyAllWindows()

3、截取部分图像数据(ROI)

#截取部分图像数据(ROI)
img=cv.imread('E:\\Pec\\cat.jpg')
#截取自己想要的切片
cat=img[100:300,0:200]
cv_show('cat',cat)

4、颜色通道提前

#颜色通道提取
img=cv.imread('E:\\Pec\\cat.jpg')
b,g,r=cv.split(img)
print(r.shape)
#将分离的颜色通道再组合
img=cv.merge((b,g,r))
print(img.shape)
#只保留R通道
cur_img=img.copy()
cur_img[:,:,0]=0 #取所有区域,把B设置0
cur_img[:,:,1]=0 #取所有区域,把G设置0
cv_show('R',cur_img)
#只保留G通道
cur_img=img.copy()
cur_img[:,:,0]=0
cur_img[:,:,2]=0
cv_show('G',cur_img)
#只保留B通道
cur_img=img.copy()
cur_img[:,:,1]=0
cur_img[:,:,2]=0
cv_show('B',cur_img)

5、边界填充

说明:把原有图像扩大一点

填充的类型:

  • 1、BORDER_REPLICATE:复制法,复制最边缘像素
  • 2、BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,如:fedcba|abcdefgh|hgfedcb
  • 3、BORDER_REFLECT_101:反射法,以最边缘像素为轴,如:gfedcb|abcdefgh|gfedcba
  • 4、BORDER_WRAP:外包装法,如:cdefgh|abcdefgh|abcdefg
  • 5、BORDER_CONSTANT:常量法,常数填充
# 边界填充
top_size,bottom_size,left_size,right_size=(50,50,50,50)#图像上下左右各填充50
replicate=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE)
reflect=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT)
reflect101=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT_101)
wrap=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_WRAP)
constant=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_CONSTANT,value=0)

plt.subplot(231),plt.imshow(img),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant),plt.title('CONSTANT')
plt.show()

【python版CV】—图像基本操作_数值计算

补充:plt.show与plt.imshow与cv2.imshow区别

plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能单独显示,后面跟着plt.show()才能显示出来

如果需要展示读入的图像,或者展示对读入图像进行一系列操作后的图像时,使用cv2.imshow();如果不需要展示图像,而是绘制一个新的图像,使用plt.imshow()。需要注意的是,opencv是BGR通道,plt默认RGB通道

6、数值计算

针对图像的数值计算,可以分一下几种

#数值计算
img_cat1=img+50
print(img[:5,:,0])#[:5,:,0]表示只展示第一列像素值
print(img_cat1[:5,:,0])
img_cat2=img+img_cat1
print(img_cat2[:5,:,0])
print(cv.add(img,img_cat1)[:5,:,0])

(1)需要增加像素值,类似于数值计算

[[111 111 111 ...  50  50  50]
[110 110 110 ... 50 50 50]
[110 110 110 ... 51 51 51]
[111 111 111 ... 52 52 52]
[112 112 112 ... 52 52 52]]
[[161 161 161 ... 100 100 100]
[160 160 160 ... 100 100 100]
[160 160 160 ... 101 101 101]
[161 161 161 ... 102 102 102]
[162 162 162 ... 102 102 102]]

(2)若像素值相加超过255,就要对256求余

[[ 16  16  16 ... 150 150 150]
[ 14 14 14 ... 150 150 150]
[ 14 14 14 ... 152 152 152]
[ 16 16 16 ... 154 154 154]
[ 18 18 18 ... 154 154 154]]

(3)若用函数add(),超过255像素值,直接取最大值

[[255 255 255 ... 150 150 150]
[255 255 255 ... 150 150 150]
[255 255 255 ... 152 152 152]
[255 255 255 ... 154 154 154]
[255 255 255 ... 154 154 154]]

7、图像融合

说明:若是两个不同的图像直接相加融合,会报下面错误

【python版CV】—图像基本操作_python_02

此时:需要调整一张图像的像素值,与另一张像素值吻合

#图像融合
src=cv.imread("E:\\Pec\\12.jpg")
print(src.shape)
print(img.shape)
src=cv.resize(src,(640,426))
print(src.shape)

图像尺寸变换的其他操作:

(1)x轴延长3倍

res=cv.resize(img,(0,0),fx=3,fy=1)
plt.imshow(res)
plt.show()
#同理y轴

【python版CV】—图像基本操作_bc_03

(2)两张图片融合

res=cv.addWeighted(img,0.4,src,0.6,0)
cv_show("input",res)

【python版CV】—图像基本操作_bc_04


标签:...,plt,img,python,cv,基本操作,255,CV,size
From: https://blog.51cto.com/u_14935708/6058980

相关文章

  • pycharm配置opencv库
    我走的弯路:对于刚刚入手OpenCV的小白,又第一次接触pycharm编译器。所以在配置opencv库的时候遇到很多问题。如下:1、如果直接在Terminal运行界面输入【pipinstallopencv-p......
  • 【OpenCV】—阈值化
    什么是阈值化?答:在对各种图形进行处理操作的过程中,需要对图像中的像素做出取舍与决策,直接剔除一些低于或者高于一定值的像素。阈值可以被视作最简单的图像分割方法。如:从一......
  • 【OpenCV】图片尺寸放缩示例程序
    这次示例程序分别演示了用resize、pyrUp、pyrDown来让源图像进行放大缩小操作#include<opencv2/opencv.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/highgu......
  • 【OpenCV】—图像金子塔与图片尺寸缩放
    序言:继续,继续,开干!!!本节学习OpenCV中的函数pyrUp和pyrDown对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法文章目录​​1、引言​​​​2、关于图......
  • 【OpenCV】—线性滤波:方框滤波、均值滤波、高斯滤波
    文章目录​​一、线性滤波:方框滤波、均值滤波、高斯滤波​​​​1、平滑处理​​​​2、图像滤波与滤波器​​​​3、线性滤波器的简介​​​​4、滤波和模糊​​​​5、邻......
  • 正确解决包含汉字的QString串转cv::String并format格式化
    QStringnow=QDateTime::currentDateTime().toString("yyyy-MM-dd_HH-mm-ss-zzz");QStringfileName1=QString::fromUtf8("D:/frame/小区监控图像_");......
  • run_py.sh shell 启动python程序
     1.run_py.sh#!/bin/shNAME=$1#$1运行时输入参数为文件名称NAME=${NAME%%.*}if[-z"$NAME"];thenecho"STRINGisempty"NAME="aa"fiecho$NAMEID=......
  • vs code怎么设置python解释器
    首先打开一个python文件,如下图所示 右键单击选择命令面板,如下图所示 接着输入python:select选择第一个 然后点击盘符,如下图所示......
  • Python+Django(1):建立项目
    为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录(Python3):运行模块venv来创建一个名为ll_env的虚拟环境:python-mvenvll_env激活虚拟环境:ll_env\S......
  • 【编程基础之Python】2、安装Python环境
    (【编程基础之Python】2、安装Python环境)安装Python环境所谓“工欲善其事,必先利其器”。在学习Python之前需要先搭建Python的运行环境。由于Python是跨平台的,支持在各种......