python opencv检索绝对路径
时间: 2024-05-17 08:11:04 浏览: 150
在Python OpenCV中,可以使用`cv2.imread()`函数读取一张图片。当使用相对路径时,OpenCV会从当前工作目录开始搜索图片,因此需要指定正确的相对路径或绝对路径。为了检索绝对路径,可以使用Python内置的`os`模块来实现,具体代码如下:
```python
import os
img_path = "test.jpg" # 相对路径
abs_path = os.path.abspath(img_path) # 转换为绝对路径
print(abs_path)
```
在上面的代码中,我们使用`os.path.abspath()`函数将相对路径转换为绝对路径,然后打印输出。当然,也可以将`os.path.abspath()`函数的返回值作为参数传递给`cv2.imread()`函数来读取图片,例如:
```python
import cv2
import os
img_path = "test.jpg" # 相对路径
abs_path = os.path.abspath(img_path) # 转换为绝对路径
img = cv2.imread(abs_path) # 读取图片
cv2.imshow("Image", img) # 显示图片
cv2.waitKey(0) # 等待按键响应
cv2.destroyAllWindows() # 关闭所有窗口
```
在上面的代码中,我们将转换后的绝对路径作为参数传递给`cv2.imread()`函数来读取图片,并通过`cv2.imshow()`函数来显示图片。
相关问题
opencv检索圆形轮廓
### 使用 OpenCV 检测图像中的圆形轮廓
为了从低对比度图像中提取圆形轮廓,可以采用一系列预处理步骤以及特定的算法来增强特征并识别圆形结构。以下是具体实现方式:
#### 预处理阶段
由于低对比度图像是指其中亮度差异较小、物体边缘不明显的情况,因此首先需要对原始图片做适当调整以提高后续操作的效果。
1. **灰度转换**
将彩色图像转化为单通道灰度图能够简化计算过程,并减少不必要的颜色信息干扰。
2. **直方图均衡化**
应用于提升整体对比度水平,使得暗部细节更加突出而亮区不过曝。
3. **高斯模糊滤波器应用**
减少噪声影响的同时保持形状特性不变;这一步对于去除细小纹理特别有用,在准备二值化的前提下尤为重要[^1]。
```python
import cv2
import numpy as np
# 加载原图
image = cv2.imread('low_contrast_image.jpg')
# 转换成灰度模式
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行直方图均衡化改善对比度
equalized_gray = cv2.equalizeHist(gray)
# 利用高斯核函数平滑过渡区域边界
blurred = cv2.GaussianBlur(equalized_gray, (9, 9), 2)
```
#### 边缘检测与形态学变换
接下来利用Canny算子捕捉可能存在的闭合曲线,之后通过膨胀腐蚀等手段进一步优化这些初步得到的结果集。
```python
# Canny Edge Detection
edges = cv2.Canny(blurred, threshold1=50, threshold2=150)
# 形态学运算填充内部孔洞
kernel = np.ones((5, 5), dtype=np.uint8)
dilated_edges = cv2.dilate(edges, kernel, iterations=1)
eroded_edges = cv2.erode(dilated_edges, kernel, iterations=1)
```
#### 提取轮廓及其属性分析
基于上述处理后的二值图像寻找所有封闭路径即为候选对象集合,从中筛选符合条件者——本案例关注的是近似圆形的目标体。
```python
contours, _ = cv2.findContours(eroded_edges.copy(), mode=cv2.RETR_EXTERNAL,
method=cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
# 计算最小包围圆
((center_x, center_y), radius) = cv2.minEnclosingCircle(contour)
# 如果半径满足一定条件则认为可能是我们要找的对象之一
if radius > 10: # 可根据实际情况设定阈值大小
# 绘制找到的圆形轮廓
circle_img = cv2.circle(image, (int(center_x), int(center_y)),
int(radius),
color=(0, 255, 0),
thickness=2)
cv2.imshow("Detected Circles", circle_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
此流程展示了完整的从读入一张低质量照片到最后成功标记出潜在圆形实体的过程。值得注意之处在于各参数的选择需依据实际应用场景灵活调整,比如不同尺寸范围内的目标物对应不同的最低可接受半径标准等等[^3]。
用python写图像检索代码
图像检索是通过计算机视觉技术实现的一种方式,可以在图像库中查找与目标图像最相似的图像。这里提供一个基于OpenCV和Scikit-learn的简单图像检索代码示例:
```python
import cv2
import numpy as np
from sklearn.cluster import KMeans
# 加载图像库
image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg']
images = []
for path in image_paths:
image = cv2.imread(path)
images.append(image)
# 提取特征
sift = cv2.xfeatures2d.SIFT_create()
keypoints = []
descriptors = []
for image in images:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kp, des = sift.detectAndCompute(gray, None)
keypoints.append(kp)
descriptors.append(des)
# 聚类
kmeans = KMeans(n_clusters=2)
kmeans.fit(np.vstack(descriptors))
# 查询图像
query_image = cv2.imread('query_image.jpg')
query_gray = cv2.cvtColor(query_image, cv2.COLOR_BGR2GRAY)
query_kp, query_des = sift.detectAndCompute(query_gray, None)
query_label = kmeans.predict(query_des)
# 计算距离
distances = []
for i, des in enumerate(descriptors):
labels = kmeans.predict(des)
distance = np.sum(labels == query_label)
distances.append(distance)
# 获取匹配的图像
indices = np.argsort(distances)[::-1]
matches = [image_paths[i] for i in indices]
print(matches)
```
这个示例代码中,我们使用SIFT算法提取图像的特征,并使用KMeans算法进行聚类。对于一个查询图像,我们提取其特征,并计算其与图像库中每张图像的距离,最后按照距离从大到小排序,返回最相似的几张图像路径。注意,这里使用的是欧几里得距离,实际应用中可以选择其他距离度量方式。
阅读全文
相关推荐
















