图象基本操作(读取、显示、通道提取、边界填充、融合、保存)

系列文章目录

关于OpenCV的一些图像处理函数
图象基本操作(读取、显示、通道提取、边界填充、融合、保存)
Retinex图像增强算法——SSR,MSR,MSRCR,MSRCP,autoMSRCR

前言

最近跑代码,需要图形可视化,就学习了一下opencv图像处理操作,简单总结了一下。

一、opencv读取图像、显示等操作

图像python读取的几种方式

基于python的图像读取方式:
基于PIL库的图像读取、保存和显示
基于opencv-python的图像读取、保存和显示
基于matplotlib的图像读取、保存和显示
基于scikit-image的图像读取、保存和显示
基于imageio的图像读取、保存和显示

安装相应的包

#用哪种方式安装相应的包就可以了
pip install pillow
pip install scikit-image
pip install matplotlib 
pip install opencv-python
pip install numpy scipy scikit-learn

1.读取彩色、灰度图像

cv2.IMREAD_COLOR:彩色图像
cv2.IMREAD_GRAYSCALE:灰度图像

import cv2  as cv
#图像在根目录下
#image =cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)  
#想要读取图片的地址  默认彩色
image = cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg")  
#读取灰度图像
#image =cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg",cv2.IMREAD_GRAYSCALE)   
#读取彩色图像
#image =cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg",cv2.IMREAD_COLOR)   
cv.imshow("img",image)
cv.waitKey(0)

如果报错:OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cp 一般是你的图片路径不对。我们可以尝试在路径里使用双斜杆“//”(绝对路径),反斜杠""(linux的路径)。别问我为什么知道,因为我掉过坑。如果不是请参考解决opencv中算术运算报错

2.图片显示

import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np 
%matplotlib inline
img = cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg")
cv2.imshow('image',img)
# ()内为等待时间,毫秒级;如果输入0则表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()

1. 图像显示函数

import cv2 #opencv读取的格式是BGR
# 显示普通图片 numpy类型
def cv_show1(name, img):  # 长宽高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
# 显示标准化后图片 维度为 高 长 宽 tensor类型
def cv_show2(name,img):  #  高 长 宽
    img = img / 2 + 0.5     # unnormalize 反标准化
    npimg = img.numpy()     # 转numpy
    cv_show(name, np.transpose(npimg, (1, 2, 0))) #转换维度
    
img = cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg")
cv_show1('image',img)

2.转化为灰度图

img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   # 转换为灰度图

3.调整图片大小

img11 = cv.resize(img, (640, 640), interpolation=cv.INTER_AREA)#调整图片大小

3.保存图像

cv2.imwrite("1.jpg",img)  #将图片保存为1.jpg

4.颜色通道提取、合并

b,g,r=cv2.split(img)  # 提取
image= cv2.merge([b, g, r])  # 通道合并。

5.边界填充

BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。

top_size,bottom_size,left_size,right_size = (50,50,50,50)

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)

6.图像融合

res = cv2.addWeighted(img1, 0.4, img2, 0.6, 0)

7.对图像数据进行简单拉伸

简述:将一组数据数组拉伸到0-255范围。

y = torch.load("myTensor20-1.pth")   #读取数据
print(y.shape)
print(y.dtype)
a=0
b=255 
new_arr = ((y - y.min()) * (a/(y.max() - y.min()) * b))
print(new_arr)

8.高斯函数

blur_image = cv2.GaussianBlur(img, (5, 5), 0)#(5, 5)表示高斯矩阵的长与宽都是5,标准差取0

cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)

src:输入图像。
ksize:高斯内核大小。
sigmaX: X方向上的高斯核标准偏差。
sigmaY: Y方向上的高斯核标准差;
如果写sigmaX,sigmaY=0,则函数会自行计算。
经验上来讲,高斯核越大图片越模糊,标准差越大也一样越模糊。

这个我有一个问题,之前遇到了下面这种用法 ,卷积核为(0,0) 那么卷积核是函数根据图片数据自动计算了吗?

cv2.GaussianBlur(img, (0, 0), sigma)

9.图片乘、加、减

image = cv2.multiply(image1, image2) # 乘
image = cv2.subtract(image1, image2) # 减
image = cv2.add(image1, image2) # 加

subtract(src1, src2, dst=None, mask=None, dtype=None)
这三个用法大致类似。
参数说明:
src1:作为被减数的图像数组或一个标量
src2:作为减数的图像数组或一个标量
dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0
dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。

10.归一化函数

指定将图片的值放缩到 0-255 之间

array = cv2.normalize(src,None,0,255,cv2.NORM_MINMAX)

函数原型:
array = cv2.normalize(src,dst=None,alpha=0,beta=255,normType=cv2.NORM_MINMAX)

参数:

src :输入数组

dst:输出数组,支持原地运算

alpha:range normalization模式的最小值

beta:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

normType:

NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

NORM_INF: 此类型的定义没有查到,根据opencv 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)

NORM_L1 :  归一化数组的L1-范数(绝对值的和)

NORM_L2:   归一化数组的(欧几里德)L2-范数

11.cv2.convertScaleAbs()

函数按顺序执行四个操作。一通过因子alpha重新调整源图像,二通过加因子beta实现偏移,三计算上述所求和的绝对值,四将结果映射到一个无符号字符型(8位)。 相当于对图片像素点取y = ax + b 的操作 然后取绝对值 取整。

img = convertScaleAbs(src, dst, alpha=1.5, beta =10)

参数:
src: 输入数组
dst:输出数组
alpha: 乘数因子
beta :偏移量

二、opencv读取视频

vc = cv2.VideoCapture("./data/test.mp4")
# 检查是否打开正确
if vc.isOpened(): 
    oepn, frame = vc.read()
else:
    open = False
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)  #变灰度图像
        cv2.imshow('result', gray)
        if cv2.waitKey(10) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

三、python Image 模块读取保存图片

from PIL import Image
# Image.open()函数只是保持了图像被读取的状态
# 对需要操作图像每个元素,如输出某个像素的RGB值等,需要执行对象的load()方法读取数据
img=Image.open("D:/code/picture processing/jupyter_code/data/319.jpg")      #读取一张图片
#img = img.load()
img.show() #显示一张图片
img.save("save.jpg") #保存图像
newImg = Image.new("RGBA",(640,480),(0,255,0))  #创建新图片

转换

# Image->cv2
img_array = np.array(img)
# cv2->Image
img_Image = Image.fromarray(np.uint8(img))

png转jpg

from PIL import Image
im = Image.open('test.png')
im = im.convert('RGB')
im.save('test.jpg', quality=95)

png转jpg其实也是一种图片压缩。save函数中quality参数指定图片质量,其取值范围是1~95,默认值是75。指定quality=95的时候,图片质量最好。

还有很多子函数 可参考这个链接http://t.csdn.cn/xln03

四、matplotlib的python数据可视化

参考http://t.csdn.cn/mpRoZ
参考http://t.csdn.cn/HeRGZ

总结

应该还有其他的函数和操作,后期遇到了慢慢添加。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chaoy6565

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值