Median filters a color image by finding the median of RGB

/***************************************************************************
* Func: color_median *
* *
* Desc: Median filters a color image by finding the median of RGB using *
* absolute differences *
* *
* Params: source - pointer to color image in memory *
* cols - number of columns in image *
* rows - number of rows in image *
* kwidth - width of window *
* filename - name of output file *
***************************************************************************/

void color_median(pixel_ptr source, int cols, int rows,
int kwidth, char *filename)
{
int x, y, i; /* image loop variables */
int kernx, kerny; /* kernel loop variables */
int index; /* image index */
int xextra, yextra; /* size of boundary */
int conv_line; /* size of output line */
unsigned long destadd; /* destination image address */
unsigned long sourceadd, sourcebase; /* source addressing */
pixel dest[1024]; /* destination image line */
FILE *fp; /* output file pointer */
unsigned char left[25];/* left buffer */
unsigned char right[25];/* right buffer */
int xpad, ypad; /* number of rows and columns that must be copied*/
int last_line; /* last line that can be processed, others copied*/
int color_line; /* size of color line */
pixel_ptr window; /* window of pixel group being processed */
int wsize; /* number of elements in the window */

xextra = (kwidth/2)*2;
xpad = xextra/2;
yextra = xextra;
ypad = xpad;
conv_line = cols - xextra;
color_line = conv_line * 3;
wsize = kwidth * kwidth;
window = malloc(wsize * sizeof(pixel));

if((fp=fopen(filename, "wb")) == NULL)
{
printf("Unable to open %s for output\n",filename);
exit(1);
}
fprintf(fp, "P6\n%d %d\n255\n", cols, rows); /* print out header */
last_line = rows - yextra;
for(y=0; y<last_line; y++)
{
sourcebase=(unsigned long) cols * y;
destadd=0;
for(x=xpad; x<(cols - xpad); x++)
{
index=0;
for(kerny=0; kerny<kwidth; kerny++)
for(kernx=0; kernx<kwidth; kernx++)
{
sourceadd=sourcebase+kernx+kerny*cols;
window[index].r = source[sourceadd].r;
window[index].g = source[sourceadd].g;
window[index++].b = source[sourceadd].b;
}
index = find_color_median(window, wsize);

dest[destadd].r = window[index].r;
dest[destadd].g = window[index].g;
dest[destadd++].b = window[index].b;
sourcebase++;
} /* for x */
for(i=0; i<xpad*3; i+=3)
{
left[i]=dest[0].r;
left[i+1]=dest[0].g;
left[i+2]=dest[0].b;
}
for(i=0; i<xpad*3; i++)
{
right[i]=dest[conv_line-1].r;
right[i+1]=dest[conv_line-1].g;
right[i+2]=dest[conv_line-1].b;
}
if(y==0)
for(i=0; i<ypad; i++)
{
fwrite(left, 1, xpad*3, fp);
fwrite(dest, 1, color_line, fp);
fwrite(right, 1, xpad*3, fp);
}
fwrite(left, 1, xpad*3, fp);
fwrite(dest, 1, color_line, fp);
fwrite(right, 1, xpad*3, fp);
if(y==(last_line-1))
for(i=0; i<ypad; i++)
{
fwrite(left, 1, xpad*3, fp);
fwrite(dest, 1, color_line, fp);
fwrite(right, 1, xpad*3, fp);
}
} /* for y */

}


/***************************************************************************
* Func: find_color_median *
* *
* Desc: computes median pixel of group by determining the lowest sum of *
* differences between each pixel and all others within window *
* *
* Params: window - block of pixels being evaluated *
* wsize - number of elements in window *
***************************************************************************/

int find_color_median(pixel_ptr window, int wsize)
{
int i, j; /* loop variables */
unsigned int vec_sum; /* vector sum */
unsigned int min_sum; /* minimum vector sum so far */
int index; /* index of current minimum vector sum */

min_sum = 10000;
index = 0;
for(i=0; i<wsize; i++)
{
vec_sum = 0;
for(j=0; j<wsize; j++)
{
vec_sum += abs(window[i].r - window[j].r);
vec_sum += abs(window[i].g - window[j].g);
vec_sum += abs(window[i].b - window[j].b);
}
if(vec_sum <= min_sum)
{
min_sum = vec_sum;
index = i;
}
}
return index;
}



### 回答1: 一个 Go 程序,用来查找两个有序数组的中位数,可能如下:func FindMedian(arr1, arr2 []int) float64 { n1 := len(arr1) n2 := len(arr2) if n1 == 0 { return float64(arr2[n2/2]) } if n2 == 0 { return float64(arr1[n1/2]) } if n1 == 1 && n2 == 1 { return float64(arr1[0] + arr2[0]) / 2.0 } if n1 == 1 { if n2 % 2 == 0 { return float64(arr2[n2/2 - 1] + arr2[n2/2]) / 2.0 } else { return float64(arr2[n2/2]) } } if n2 == 1 { if n1 % 2 == 0 { return float64(arr1[n1/2 - 1] + arr1[n1/2]) / 2.0 } else { return float64(arr1[n1/2]) } } i := n1 - 1 j := n2 - 1 var median1, median2 int for i >= 0 && j >= 0 { if arr1[i] > arr2[j] { median1 = arr1[i] i-- } else { median1 = arr2[j] j-- } } if i == -1 { median2 = arr2[j-1] } else { median2 = arr1[i-1] } return float64(median1 + median2) / 2.0 } ### 回答2: 生成一个Go程序来查找两个有序数组的中位数。 首先,我们需要明确中位数的定义。对于一个有序数组,中位数是指位于数组中间位置的元素。如果数组长度为奇数,中位数就是唯一那个中间元素;如果数组长度为偶数,中位数是中间的两个元素的平均值。 接下来,我们可以使用以下步骤生成一个Go程序来找到两个有序数组的中位数: 1. 声明一个函数,例如findMedian,该函数接受两个有序数组作为输入参数。 2. 初始化变量n,用于存储两个有序数组的总长度。 3. 通过将两个有序数组合并为一个新的有序数组,找到中位数所在的位置。可以使用合并排序或使用两个指针的方法来实现这一步骤。 4. 根据总长度n的奇偶性,分别处理中位数的情况: - 如果n为奇数,返回新数组中间位置的元素作为中位数。 - 如果n为偶数,返回新数组中间两个元素的平均值作为中位数。 5. 在主函数中调用findMedian函数,传递两个有序数组作为参数,并打印出中位数结果。 下面是一个示例的Go程序,通过使用合并排序的方法找到两个有序数组的中位数: ```go package main import "fmt" func merge(nums1 []int, nums2 []int) []int { merged := make([]int, len(nums1)+len(nums2)) i, j, k := 0, 0, 0 for i < len(nums1) && j < len(nums2) { if nums1[i] < nums2[j] { merged[k] = nums1[i] i++ } else { merged[k] = nums2[j] j++ } k++ } for i < len(nums1) { merged[k] = nums1[i] i++ k++ } for j < len(nums2) { merged[k] = nums2[j] j++ k++ } return merged } func findMedian(nums1 []int, nums2 []int) float64 { merged := merge(nums1, nums2) n := len(merged) if n%2 == 0 { return float64(merged[n/2-1]+merged[n/2]) / 2.0 } else { return float64(merged[n/2]) } } func main() { nums1 := []int{1, 3} nums2 := []int{2} median := findMedian(nums1, nums2) fmt.Printf("Median is: %.2f", median) } ``` 以上示例展示了如何使用合并排序的方法找到两个有序数组的中位数。你可以根据自己的需求进行扩展和修改,以适应其他情况和更复杂的需求。 ### 回答3: 下面是一个生成 Go 程序以找到两个有序数组的中位数的示例: ```go package main import ( "fmt" ) func findMedianSortedArrays(nums1 []int, nums2 []int) float64 { m, n := len(nums1), len(nums2) if m > n { nums1, nums2, m, n = nums2, nums1, n, m } imin, imax, half_len := 0, m, (m+n+1)/2 var max_of_left, min_of_right int for imin <= imax { i := (imin + imax) / 2 j := half_len - i if i < m && nums2[j-1] > nums1[i] { imin = i + 1 } else if i > 0 && nums1[i-1] > nums2[j] { imax = i - 1 } else { if i == 0 { max_of_left = nums2[j-1] } else if j == 0 { max_of_left = nums1[i-1] } else { max_of_left = max(nums1[i-1], nums2[j-1]) } break } } if (m+n)%2 == 1 { return float64(max_of_left) } if i == m { min_of_right = nums2[j] } else if j == n { min_of_right = nums1[i] } else { min_of_right = min(nums1[i], nums2[j]) } return float64(max_of_left+min_of_right) / 2.0 } func max(a, b int) int { if a > b { return a } return b } func min(a, b int) int { if a < b { return a } return b } func main() { nums1 := []int{1, 3} nums2 := []int{2} median := findMedianSortedArrays(nums1, nums2) fmt.Printf("The median is: %.2f\n", median) } ``` 这个程序实现了在合并后的有序数组中找到中位数的逻辑。它首先判断数组的大小,然后使用二分查找的方法从较小的数组开始分割,保证左边的元素数量等于右边(或比右边多1)。然后通过比较左侧的最大值和右侧的最小值来确定中位数。如果数组长度是奇数,则直接返回中位数的值;如果是偶数,则计算左侧最大值和右侧最小值的平均值作为中位数的值。 在 main 函数中,我们定义了两个示例的有序数组 `nums1` 和 `nums2`,然后调用 `findMedianSortedArrays` 函数计算它们的中位数,并打印结果。 请注意,这只是一个示例程序,您可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值