图像处理学习day01——图像基本操作(读取、转化灰度图、填充、平滑处理)

张开发
2026/4/13 13:18:47 15 分钟阅读

分享文章

图像处理学习day01——图像基本操作(读取、转化灰度图、填充、平滑处理)
声明本文章将用于记录个人用户下午好556学习图像处理(opencv)基本算法的过程参考资料为唐宇迪的AI入门课——opencv1、图像基本操作计算机眼中的图像分为RGB三个通道每个通道对应一个像素值2、opencv读取图像操作程序代码将图像读取为彩色图import cv2 import numpy as np # 读取一张图像 img cv2.imread(img.jpg) print(img.shape) # 形状为[H,W,C],即长、宽、通道数 print(*60) print(img) cv2.imshow(image,img) cv2.waitKey(0) # 等待时间为0毫秒意味着图像不会自动关闭.按下任意键后窗口自动关闭 cv2.destroyAllWindows()程序运行结果程序代码将图像读取为灰度图需要在cv2.imread函数中加上cv2.IMREAD_GRAYSCALEimport cv2 import numpy as np # 读取一张图像,将图像读取为灰度图 img cv2.imread(img.jpg,cv2.IMREAD_GRAYSCALE) print(img.shape) # 形状为[H,W,C],即长、宽、通道数 print(*60) print(img) cv2.imshow(image,img) cv2.waitKey(0) # 等待时间为0毫秒意味着图像不会自动关闭.按下任意键后窗口自动关闭 cv2.destroyAllWindows()程序运行结果可以看到此时图像的shape发生了改变只剩下了[H,W]没有了通道数这是因为灰度图像只有1个通道3、opencv读取视频操作程序代码import cv2 # 通过 VideoCapture 函数读取视频 videocv2.VideoCapture(video.mp4) open_statusFalse # 检测视频是否成功打开 if video.isOpened(): # 如果视频成功打开则获取 视频打开状态 和 第一帧图像 open_status,framevideo.read() else: # 如果视频没有成功打开则将 视频打开状态 设置为False open_statusFalse # 循环读取每一帧图像 while open_status: ret,framevideo.read() # 如果读取到的 图像帧 为空则结束循环 if frame is None: break # 如果正常读取到图像时 if retTrue: # 则将读取到的 图像帧 转换为灰度图 graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 在窗口中显示灰度帧 #cv2.imshow(frame,frame) # 显示 原始图像帧 即正常视频不是灰度图 cv2.imshow(result, gray) # 等待键盘输入100ms为延迟时间控制播放速度数值越大播放越慢 # 0xFF 是为了兼容不同系统的按键值27对应ESC键 if cv2.waitKey(100) 0xFF 27: break video.release() cv2.destroyAllWindows()程序运行结果4、ROI区域所谓ROI区域就是指的用户感兴趣的区域有时候读取到一张图像后并不一定对图像的所有信息感兴趣而是只对部分信息感兴趣因此可以通过截取操作得到感兴趣的部分程序代码import cv2 img cv2.imread(img.jpg) print(foriginal_img.shape:{img.shape}) print(*40) # 截取图像的部分区域 peopleimg[300:500,300:500] print(fdealed_pic.shape:{people.shape}) cv2.imshow(dealed_pic,people) cv2.waitKey(0) cv2.destroyAllWindows()程序运行结果甚至有的时候我们只需要B\G\R三个通道中的其中一个此时也可以将另外两个通道的像素值设置为0程序代码import cv2 img cv2.imread(img.jpg) # 只保留B # cur_imgimg.copy() # cur_img[:,:,1]0 # cur_img[:,:,2]0 # cv2.imshow(only_B,cur_img) # cv2.waitKey(0) # cv2.destroyAllWindows() # 只保留G # cur_imgimg.copy() # cur_img[:,:,0]0 # cur_img[:,:,2]0 # cv2.imshow(only_G,cur_img) # cv2.waitKey(0) # cv2.destroyAllWindows() # 只保留R cur_imgimg.copy() cur_img[:,:,0]0 cur_img[:,:,1]0 cv2.imshow(only_R,cur_img) cv2.waitKey(0) cv2.destroyAllWindows()程序运行结果5、边界填充操作程序代码import cv2 import matplotlib.pyplot as plt # 读取一张图像,将图像读取为灰度图 img cv2.imread(img.jpg) # 定义上下左右四个方向的填充尺寸单位为像素 top_size, bottom_size, left_size, right_size (50, 50, 50, 50) # 1. BORDER_REPLICATE复制边缘像素填充用最边缘的像素值向外延伸 replicate cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderTypecv2.BORDER_REPLICATE) # 2. BORDER_REFLECT镜像反射填充以边缘为轴对称复制像素如 abcde → edcba|abcde|dcba reflect cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT) # 3. BORDER_REFLECT_101镜像反射填充以边缘像素为轴对称复制如 abcde → dcba|abcde|dcb边缘像素只出现一次 reflect101 cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101) # 4. BORDER_WRAP外包装填充循环复制相当于把图像上下/左右拼接起来 wrap cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP) # 5. BORDER_CONSTANT常量填充用指定的固定值填充这里value0即黑色填充 constant cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value0) plt.subplot(231), plt.imshow(img, gray), plt.title(ORIGINAL) plt.subplot(232), plt.imshow(replicate, gray), plt.title(REPLICATE) plt.subplot(233), plt.imshow(reflect, gray), plt.title(REFLECT) plt.subplot(234), plt.imshow(reflect101, gray), plt.title(REFLECT_101) plt.subplot(235), plt.imshow(wrap, gray), plt.title(WRAP) plt.subplot(236), plt.imshow(constant, gray), plt.title(CONSTANT) # 显示图像 plt.show()程序运行结果6、数值计算1图片像素值直接执行加法程序代码import cv2 # 读取图像 img_cat cv2.imread(cat.png) img_dog cv2.imread(dog.png) # 进行像素值计算 img_cat2 img_cat 10 print(original_img_cat:) print(img_cat[:5,:,0]) print(*60) print(dealed_img_cat:) print(img_cat2[:5,:,0])程序运行结果2两张图片相加即对应部分的像素值相加超出255部分的像素值需要对256进行取余操作程序代码import cv2 # 读取图像 img_cat cv2.imread(cat.png) img_dog cv2.imread(dog.png) print(fimg_cat.shape: {img_cat.shape}) # 进行像素值计算 img_cat2 img_cat 10 img_cat3 img_cat img_cat2 print(original_img_cat:) print(img_cat[300:305,400:,0]) print(*60) print(dealed_img_cat2:) print(img_cat2[300:305,400:,0]) print(*60) print(dealed_img_cat3:) print(img_cat3[300:305,400:,0]) print(*60)程序运行结果3add函数执行两张图片像素值相加但是超出255部分的像素值直接用255填充程序代码import cv2 # 读取图像 img_cat cv2.imread(cat.png) img_dog cv2.imread(dog.png) print(fimg_cat.shape: {img_cat.shape}) # 进行像素值计算 img_cat2 img_cat 10 img_cat3 img_cat img_cat2 print(original_img_cat:) print(img_cat[300:305,400:,0]) print(*60) print(dealed_img_cat2:) print(img_cat2[300:305,400:,0]) print(*60) print(dealed_img_cat3:) print(cv2.add(img_cat,img_cat2)[300:305,400:,0])程序运行结果4图像融合addWeighted函数程序代码import cv2 import matplotlib.pyplot as plt # 读取图像 img_cat cv2.imread(cat.png) img_dog cv2.imread(dog.png) print(fimg_cat.shape: {img_cat.shape}) print(fimg_dog.shape: {img_dog.shape}) print(*40) # 实现两张图片融合操作 # 首先需要将两张图片的shape设置为一致 h,w img_cat.shape[:2] img_dog cv2.resize(img_dog, (w,h)) print(fimg_cat.shape: {img_cat.shape}) print(fimg_dog.shape: {img_dog.shape}) # 实现融合 img cv2.addWeighted(img_cat, 0.5, img_dog, 0.5, 0) # 显示图像 cv2.imshow(img_cat, img_cat) cv2.imshow(img_dog, img_dog) cv2.imshow(img, img) cv2.waitKey(0) cv2.destroyAllWindows()程序运行结果5图像缩放resize函数程序代码import cv2 import matplotlib.pyplot as plt # 读取图像 img_cat cv2.imread(cat.png) img_dog cv2.imread(dog.png) print(fimg_cat.shape: {img_cat.shape}) print(*40) # x和y为11 img_cat2 cv2.resize(img_cat,(0,0),fx1,fy1) # x和y为31 img_cat3 cv2.resize(img_cat,(0,0),fx3,fy1) # x和y为13 img_cat4 cv2.resize(img_cat,(0,0),fx1,fy3) # 显示图像 plt.subplot(2,2,1) plt.imshow(img_cat) plt.subplot(2,2,2) plt.imshow(img_cat2) plt.subplot(2,2,3) plt.imshow(img_cat3) plt.subplot(2,2,4) plt.imshow(img_cat4) plt.show()程序运行结果7、阈值与平滑处理1阈值处理程序代码import cv2 import matplotlib.pyplot as plt # 读取图像 img_cat cv2.imread(cat.png) # -------------------------- 5种阈值化处理 -------------------------- # 1. 二值化阈值 (THRESH_BINARY)大于阈值设为255否则设为0 ret, thresh1 cv2.threshold(img_cat, 127, 255, cv2.THRESH_BINARY) # 2. 反二值化阈值 (THRESH_BINARY_INV)大于阈值设为0否则设为255 ret, thresh2 cv2.threshold(img_cat, 127, 255, cv2.THRESH_BINARY_INV) # 3. 截断阈值 (THRESH_TRUNC)大于阈值设为阈值否则保持原值 ret, thresh3 cv2.threshold(img_cat, 127, 255, cv2.THRESH_TRUNC) # 4. 置零阈值 (THRESH_TOZERO)大于阈值保持原值否则设为0 ret, thresh4 cv2.threshold(img_cat, 127, 255, cv2.THRESH_TOZERO) # 5. 反置零阈值 (THRESH_TOZERO_INV)大于阈值设为0否则保持原值 ret, thresh5 cv2.threshold(img_cat, 127, 255, cv2.THRESH_TOZERO_INV) # -------------------------- 可视化对比 -------------------------- # 标题列表 titles [Original Image, BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV] # 图像列表原图 5种阈值化结果 images [img_cat, thresh1, thresh2, thresh3, thresh4, thresh5] # 绘制2行3列的子图 for i in range(6): plt.subplot(2, 3, i 1) plt.imshow(images[i], gray) # 以灰度模式显示 plt.title(titles[i]) # 设置子图标题 plt.xticks([]), plt.yticks([]) # 隐藏坐标轴刻度 # 显示所有子图 plt.show()程序运行结果2平滑处理滤波操作1均值滤波对于卷积核中心点的像素值取卷积核内所有点的像素值的平均值2方框滤波基本与均值滤波相同归一化对于卷积核中心点的像素值取卷积核内所有点的像素值的平均值不归一化对于卷积核中心点的像素值取卷积核内所有点的像素值的求和越界用255填充3高斯滤波对于卷积核中心点的像素值距离卷积核中心位置像素值较近的像素值给予更高的权重然后进行加权求和平均4中值滤波对于卷积核中心点的像素值取卷积核内部所有点的像素值经由小到大排序后的中值程序代码import cv2 import numpy as np imgcv2.imread(salt_noise_result.jpg) imgcv2.resize(img,(400,400),fx1,fy1) # 均值滤波 blurcv2.blur(img,(3,3)) # 高斯滤波 gausscv2.GaussianBlur(img,(3,3),0) # 中值滤波 mediancv2.medianBlur(img,3) # 展示原始图像(带噪声)和所有处理后的图像 cv2.imshow(original,img) res np.hstack((blur,gauss,median)) cv2.imshow(filter,res) cv2.waitKey(0) cv2.destroyAllWindows()程序运行结果

更多文章