计算机视觉-图像的基本操作
迪丽瓦拉
2025-06-01 15:07:49
0

图像的基本操作

  • 1.读取图像
    • 1.1代码实现
    • 1.2两者的差异
  • 2.创建图像缩略图
    • 2.1代码实现
    • 2.2两者的差异
  • 3.绘制图像的轮廓与直方图
    • 3.1代码实现
    • 3.2运行结果
  • 4.实现图像的灰度变换、直方图均衡化
    • 4.1代码实现
    • 4.2运行结果
  • 5.实现图像的不同高斯模糊、计算导数
    • 5.1代码实现
    • 5.2运行结果
  • 6.形态学计数(计算圆形个数等)、去噪
    • 6.1代码实现
    • 6.2运行结果
  • 7.小结

1.读取图像

本实验分别使用PIL库和OpenCV库读取图像并实现可视化,并对比OpenCV读取和PIL读取的差异。

1.1代码实现

# Using PIL library
from PIL import Image
import matplotlib.pyplot as pltimg_pil = Image.open('001.jpg')
plt.imshow(img_pil)
plt.show()# Using OpenCV library
import cv2img_cv = cv2.imread('001.jpg')
cv2.imshow('image', img_cv)
cv2.waitKey(0)
cv2.destroyAllWindows()

先是PIL库的可视化:
在这里插入图片描述
这是OpenCV库的可视化:
在这里插入图片描述

1.2两者的差异

  • 颜色空间
    PIL库默认使用RGB颜色空间读取图像,而OpenCV库默认使用BGR颜色空间读取图像。这意味着,如果我们使用OpenCV库读取图像并使用PIL库显示图像,图像的颜色可能会有所不同。
  • 数据类型
    PIL库使用的图像数据类型为PIL.Image,而OpenCV库使用的图像数据类型为NumPy数组。这意味着,如果我们想要在两个库之间传递图像数据,需要进行数据类型的转换。
  • 图像大小
    PIL库读取图像时会将图像缩放到适合显示的大小,而OpenCV库读取图像时不会自动缩放图像。因此,在使用OpenCV库显示图像时,我们需要手动调整图像的大小。

2.创建图像缩略图

2.1代码实现

# Using OpenCV library
import cv2img_cv = cv2.imread('001.jpg')
img_cv = cv2.resize(img_cv, (300, 300)) # resize image
cv2.imshow('image', img_cv)
cv2.waitKey(0)
cv2.destroyAllWindows()# create thumbnail
img_cv_thumbnail = cv2.imread('001.jpg')
img_cv_thumbnail = cv2.resize(img_cv_thumbnail, (100, 100)) # resize image
cv2.imshow('thumbnail', img_cv_thumbnail)
cv2.waitKey(0)
cv2.destroyAllWindows()

先是resize
在这里插入图片描述
然后是thumbnail函数
在这里插入图片描述

2.2两者的差异

thumbnail()和resize()都是PIL库中的图像处理函数,可以用来改变图像的尺寸。它们的不同在于thumbnail()会保持图像的宽高比例,同时尽可能的缩小图像以适应给定的大小。而resize()则可以通过指定目标图像的宽度和高度来改变图像的大小,它不会保持图像的宽高比例。

3.绘制图像的轮廓与直方图

3.1代码实现

import cv2
import numpy as np
from matplotlib import pyplot as plt# 读取图像
img = cv2.imread('001.jpg', 0)# 绘制轮廓
edges = cv2.Canny(img, 100, 200)
plt.subplot(121), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])# 绘制直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.subplot(122), plt.plot(hist)
plt.title('Histogram'), plt.xlim([0, 256])plt.show()

3.2运行结果

这是该图片的轮廓和直方图:
在这里插入图片描述

4.实现图像的灰度变换、直方图均衡化

4.1代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img = cv2.imread('001.jpg', cv2.IMREAD_GRAYSCALE)# 灰度变换
img_gray = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)# 直方图均衡化
img_eq = cv2.equalizeHist(img)# 显示图像
plt.subplot(1, 3, 1)
plt.imshow(img_gray)
plt.title('Original')plt.subplot(1, 3, 2)
plt.imshow(img_eq)
plt.title('Equalized')plt.show()

4.2运行结果

以下是运行结果:
在这里插入图片描述

5.实现图像的不同高斯模糊、计算导数

5.1代码实现

import cv2
import numpy as np# Load image
img = cv2.imread('001.jpg')# Gaussian blur with kernel size 3x3
blur_3x3 = cv2.GaussianBlur(img, (3, 3), 0)# Gaussian blur with kernel size 5x5
blur_5x5 = cv2.GaussianBlur(img, (5, 5), 0)# Calculate derivatives using Sobel operator
dx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
dy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)# Display results
cv2.imshow('Original', img)
cv2.imshow('3x3 Gaussian Blur', blur_3x3)
cv2.imshow('5x5 Gaussian Blur', blur_5x5)
cv2.imshow('Sobel dx', dx)
cv2.imshow('Sobel dy', dy)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2运行结果

原始图片
在这里插入图片描述
3×3高斯模糊
在这里插入图片描述
5×5高斯模糊
在这里插入图片描述
Sobel对x的梯度
在这里插入图片描述
Sobel对y的梯度
在这里插入图片描述

6.形态学计数(计算圆形个数等)、去噪

6.1代码实现

import cv2
import numpy as np# Load image
img = cv2.imread('001.jpg', cv2.IMREAD_GRAYSCALE)# Apply Gaussian blur to remove noise
blur = cv2.GaussianBlur(img, (5, 5), 0)# Apply thresholding to convert image to binary
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# Apply morphological operations to remove noise and fill holes
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel, iterations=2)# Find contours and draw them on the original image
contours, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)# Count the number of circles
circles = cv2.HoughCircles(closing, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
if circles is not None:circles = np.round(circles[0, :]).astype("int")print("Number of circles:", len(circles))
else:print("No circles found")# Display the result
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.2运行结果

高斯去噪后在原图上画出轮廓
在这里插入图片描述
命令行输出
在这里插入图片描述
从上面的轮廓图就可以看出本图没有圆形轮廓,所以计数应该是0。

7.小结

本次实验主要使用了OpenCV库对图像进行处理,包括读取、可视化、缩略、变换、绘制轮廓和直方图、灰度变换、直方图均衡化、高斯模糊、计算导数、形态学计数和去噪等应用。OpenCV库适合用于计算机视觉应用程序,可应用于图像分析和处理。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...