7-2 图像焦点
分数 5
全屏浏览题目
切换布局
作者 王从银单位 吉首大学
本题目要求输入一个存放灰度图像的二维数组并计算该图像的焦点像素的位置。题目定义一个像素周围3X3范围内的9个像素的平均灰度值为该像素的亮度系数,亮度系数最大的像素为焦点像素。题目设定图像之外的灰度值都是0。
输入格式:
第一行是灰度图像的高度h(h<=500)和宽度w(w<=600);
接下来是存放灰度图像的二维数组,灰度值取值范围[0, 255]。
输出格式:
输出第一个焦点像素所在位置,即空格分隔的行号与列号。所谓“第一个”按从上到下从左到右的顺序而定。
输入样例:
10 8
1 1 1 1 1 1 1 4
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 5 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1
1 1 1 3 1 1 1 1
1 1 1 3 1 1 1 1
1 1 1 2 1 1 1 1
输出样例:
8 2
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
分析:
本题关键就是计算和比较每一个焦点像素的亮度系数,我们实际上不需要计算3X3范围内的9个像素的平均灰度值,只要算出和来比较就可以找出最大值。
代码实现:
#include<stdio.h>
int main()
{
int p[500][600];//定义存放灰度图像的二维数组
int h,w;//定义高,宽
scanf("%d%d",&h,&w);//输入高,宽
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
scanf("%d",&p[i][j]);//输入二维数组
}
}
int maxh=0,maxw=0;//定义第一个焦点像素的位置
int max=0;//一个像素周围3X3范围内的9个像素的和的最大值
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
int sum=0;//一个像素周围3X3范围内的9个像素的和
for(int m=i-1;m<i+2;m++)//用for循环计算像素和
{
for(int n=j-1;n<j+2;n++)
{
if(m<0 || m>=h || n<0 || n>=w) continue;//分为两种情况
else sum+=p[m][n];//根据位置判断是否计算
}
}
if(sum>max)
{
max=sum;//得到最大值及其位置
maxh=i;
maxw=j;
}
}
}
printf("%d %d",maxh,maxw);//输出位置
}