An image smoother is a filter of the size 3 x 3
that can be applied to each cell of an image by rounding down the average of the cell and the eight surrounding cells (i.e., the average of the nine cells in the blue smoother). If one or more of the surrounding cells of a cell is not present, we do not consider it in the average (i.e., the average of the four cells in the red smoother).
Given an m x n
integer matrix img
representing the grayscale of an image, return the image after applying the smoother on each cell of it.
Example 1:
Input: img = [[1,1,1],[1,0,1],[1,1,1]] Output: [[0,0,0],[0,0,0],[0,0,0]] Explanation: For the points (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0 For the points (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0 For the point (1,1): floor(8/9) = floor(0.88888889) = 0
Example 2:
Input: img = [[100,200,100],[200,50,200],[100,200,100]] Output: [[137,141,137],[141,138,141],[137,141,137]] Explanation: For the points (0,0), (0,2), (2,0), (2,2): floor((100+200+200+50)/4) = floor(137.5) = 137 For the points (0,1), (1,0), (1,2), (2,1): floor((200+200+50+200+100+100)/6) = floor(141.666667) = 141 For the point (1,1): floor((50+200+200+200+200+100+100+100+100)/9) = floor(138.888889) = 138
Constraints:
m == img.length
n == img[i].length
1 <= m, n <= 200
0 <= img[i][j] <= 255
program main
use, intrinsic :: iso_fortran_env, only : error_unit, iostat_end, DP => REAL64
implicit none
integer, parameter :: m = 3, n = 3
integer, dimension(m, n) :: img
real(kind=DP), dimension(m, n) :: smoothed_img
integer :: i, j
! read input
read(*, *) img
! apply smoother
do i = 1, m
do j = 1, n
smoothed_img(i, j) = floor(avg(img(i-1:i+1, j-1:j+1)))
end do
end do
! print output
write (*, '(A)') 'Smoothed image:'
do i = 1, m
write (*, '(3I3)') smoothed_img(i, :)
end do
contains
function avg(arr) result(res)
implicit none
integer, intent(in) :: arr(:, :)
integer :: res
res = sum(arr) / size(arr, dim=1)
end function avg
end program main
temp.f95:15:39: 15 | smoothed_img(i, j) = floor(avg(img(i-1:i+1, j-1:j+1))) | 1 Error: ‘a’ argument of ‘floor’ intrinsic at (1) must be REAL
program imageSmoother
implicit none
integer, parameter :: m = 3, n = 3
integer :: img(m, n)
integer :: smoothedImg(m, n)
! test case 1
img = reshape((/1, 1, 1, 1, 0, 1, 1, 1, 1/), shape=(/m, n/))
smoothedImg = imageSmoother(img)
write (*,*) smoothedImg
! test case 2
img = reshape((/100, 200, 100, 200, 50, 200, 100, 200, 100/), shape=(/m, n/))
smoothedImg = imageSmoother(img)
write (*,*) smoothedImg
end program imageSmoother
function imageSmoother(img) result(smoothedImg)
implicit none
integer, intent(in) :: img(3, 3)
integer :: smoothedImg(3, 3)
integer :: i, j
integer :: sum, count
do i = 1, 3
do j = 1, 3
sum = 0
count = 0
! calculate the sum and count of the surrounding cells
if (i > 1 .and. j > 1) then
sum = sum + img(i-1, j-1)
count = count + 1
end if
if (i > 1) then
sum = sum + img(i-1, j)
count = count + 1
end if
if (i > 1 .and. j < 3) then
sum = sum + img(i-1, j+1)
count = count + 1
end if
if (j > 1) then
sum = sum + img(i, j-1)
count = count + 1
end if
if (j < 3) then
sum = sum + img(i, j+1)
count = count + 1
end if
if (i < 3 .and. j > 1) then
sum = sum + img(i+1, j-1)
count = count + 1
end if
if (i < 3) then
sum = sum + img(i+1, j)
count = count + 1
end if
if (i < 3 .and. j < 3) then
sum = sum + img(i+1, j+1)
count = count + 1
end if
! calculate the average and round down
if (count > 0) then
smoothedImg(i, j) = int(sum / count)
else
smoothedImg(i, j) = 0
end if
end do
end do
end function imageSmoother
temp.f95:10:32: 10 | smoothedImg = imageSmoother(img) | 1 Error: Symbol at (1) is not appropriate for an expression temp.f95:15:32: 15 | smoothedImg = imageSmoother(img) | 1 Error: Symbol at (1) is not appropriate for an expression temp.f95:19:0: 1 | program imageSmoother | 2 ...... 19 | function imageSmoother(img) result(smoothedImg) | Error: Global name ‘imagesmoother’ at (1) is already being used as a PROGRAM at (2)
def imageSmoother(img):
m, n = len(img), len(img[0])
result = [[0] * n for _ in range(m)]
for i in range(m):
for j in range(n):
count, total = 0, 0
for x in range(i - 1, i + 2):
for y in range(j - 1, j + 2):
if 0 <= x < m and 0 <= y < n:
total += img[x][y]
count += 1
result[i][j] = total // count
return result
#include <vector>
using namespace std;
vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
int m = img.size(), n = img[0].size();
vector<vector<int>> result(m, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int count = 0, sum = 0;
for (int x = i - 1; x <= i + 1; x++) {
for (int y = j - 1; y <= j + 1; y++) {
if (x >= 0 && x < m && y >= 0 && y < n) {
sum += img[x][y];
count++;
}
}
}
result[i][j] = sum / count;
}
}
return result;
}