PTA 1066 图像过滤

本文介绍了一种简单的图像过滤算法,用于将指定灰度值区间的像素替换为指定颜色,通过输入判断与输出格式控制,实现了黑白图像的重要部分凸显。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下

图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来。现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换。

输入格式:

输入在第一行给出一幅图像的分辨率,即两个正整数 M 和 N(0<M,N≤500),另外是待过滤的灰度值区间端点 A 和 B(0≤A<B≤255)、以及指定的替换灰度值。随后 M 行,每行给出 N 个像素点的灰度值,其间以空格分隔。所有灰度值都在 [0, 255] 区间内。

输出格式:

输出按要求过滤后的图像。即输出 M 行,每行 N 个像素灰度值,每个灰度值占 3 位(例如黑色要显示为 000),其间以一个空格分隔。行首尾不得有多余空格。

输入样例:

3 5 100 150 0
3 189 254 101 119
150 233 151 99 100
88 123 149 0 255

输出样例:

003 189 254 000 000
000 233 151 099 000
088 000 000 000 255

解题思路

这题很简单,输入的时候就进行判断,是否处于A与B之间,如果是则直接将值修改为替换值即可。输出的时候可以判断是否为每行的第一个元素,如果是则输入该值,否则在改值的前面添加一个空格来控制输出的格式。总体而言非常简单,printf能够控制输出的格式利用printf("%03d")能够输出长度为3,利用0填充的数字。

代码如下

#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
int main()
{
	int M,N,A,B,replace;
	
	vector< vector<int> > col;
	cin>>M>>N>>A>>B>>replace;
	int num;
	for(int i=0;i<M;i++)
	{
		vector<int> row;
		for(int j=0;j<N;j++)
		{
			cin>>num;
			if(num>=A&&num<=B)
				row.push_back(replace);
			else
				row.push_back(num);
		}
		col.push_back(row);
	}

	for(int i=0;i<col.size();i++)
	{
		for(int j=0;j<col[i].size();j++)
		{
			if(j==0)
				printf("%03d",col[i][j]);
			else
				printf(" %03d",col[i][j]);
		}
		cout<<endl;
	}
}

运行结果

在这里插入图片描述

### 使用Python计算图像相似度 要实现基于SIFT算法图像相似度计算,可以通过以下方式完成: #### SIFT算法简介 SIFT(Scale-Invariant Feature Transform)是一种用于检测和描述局部特征的强大工具。它能够提取出具有尺度不变性和旋转不变性的关键点及其描述符[^1]。 #### OpenCV中的SIFT接口 在OpenCV库中已经实现了SIFT算法的相关功能,可以直接调用`cv2.xfeatures2d.SIFT_create()`来创建SIFT对象并提取图像的关键点和描述符[^2]。 #### 图像匹配流程 为了找到两幅图像之间的相似度,可以按照以下逻辑操作: 1. 提取每张图像的关键点和描述符。 2. 利用FLANN(Fast Library for Approximate Nearest Neighbors)或其他匹配器进行描述符匹配。 3. 应用Lowe's Ratio Test进一步筛选掉可能存在的误匹配点[^3]。 4. 计算最终匹配点的数量或者比例作为衡量标准之一。 以下是完整的代码示例: ```python import cv2 import numpy as np def compute_similarity(image_path1, image_path2): # 加载图片为灰度模式 img1 = cv2.imread(image_path1, 0) img2 = cv2.imread(image_path2, 0) # 创建SIFT实例 sift = cv2.xfeatures2d.SIFT_create() # 获取关键点与描述子 kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # FLANN参数配置 flann_index_kdtree = 1 index_params = dict(algorithm=flann_index_kdtree, trees=5) search_params = dict(checks=50) # 配置FLANN匹配器 flann = cv2.FlannBasedMatcher(index_params, search_params) # 进行knnMatch获取两个最近邻居 matches = flann.knnMatch(des1, des2, k=2) good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: # Lowe's ratio test with threshold of 0.7 good_matches.append(m) similarity_score = len(good_matches) / max(len(kp1), len(kp2)) # 归一化得分 return similarity_score # 测试函数 similarity = compute_similarity('image1.jpg', 'image2.jpg') print(f'Image Similarity Score: {similarity:.2f}') ``` 此脚本定义了一个名为`compute_similarity`的功能模块,接受两条路径输入分别指向待比较的两张照片文件位置;接着运用上述提到的技术手段得出它们之间某种程度上的“相像指数”。 ### 注意事项 - 上述方法依赖于安装有opencv-contrib-python包才能正常使用SIFT特性,因为基础版Opencv并不包含这部分高级内容。 - 实际应用过程中需注意版权问题以及专利限制情况下的合法合规性考量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值