在opencv中使用中值滤波进行图像压缩,但不使用中值滤波函数
我用c语言编写了中值滤波程序。我将无符号整数数组值指定给cvscalar值。但我无法为输出图像组合RGB值。我在cvscalar中获得了单独的颜色。如何组合它们?这里我附上了我的程序在opencv中使用中值滤波进行图像压缩,但不使用中值滤波函数,c,image-processing,opencv,C,Image Processing,Opencv,我用c语言编写了中值滤波程序。我将无符号整数数组值指定给cvscalar值。但我无法为输出图像组合RGB值。我在cvscalar中获得了单独的颜色。如何组合它们?这里我附上了我的程序 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxtypes.h" #include "stdio.h" #include "conio.h" #include "math.h" #include "windows.h" in
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxtypes.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
IplImage *image = 0;
image = cvLoadImage( "D:/ragavan/ragav.jpg", 1 );
IplImage *image1=cvCloneImage(image);
cvNamedWindow( "Show", 1 );
cvShowImage( "Show", image );
unsigned int a[400][300],c[400][300];
unsigned int p[9],t=0;
// int height,width,step,channels;
// uchar *data;
int i,j,m,n,k=0,l;
CvScalar s,w;
CvSize size=cvGetSize(image);
unsigned int x=size.height;
unsigned int y=size.width;
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
{
s=cvGet2D(image,i,j); /*for getting i,j pixels*/
c[i][j]=s.val[0]+s.val[1]+s.val[2]/3;
// printf ("%d\t",c[i][j]);
}
// printf("\n");
}
/*to write median filter pgm without using function*/
for(m=0;m<x;m++)
{
for(n=0;n<y;n++)
{
k=0;
for(i=m;i<m+3;i++)
{
for(j=n;j<n+3;j++)
{
p[k]=c[i][j]; /*assign 2 dimension values to single dimension */
k=k+1;
}
}
for(l=0;l<9;l++)
{
for(k=0;k<8;k++)
{
if(p[k]>p[k+1])
{ /*to sort the image pixels */
t=p[k];
p[k]=p[k+1];
p[k+1]=t;
}
}
}
c[m+1][n+1]=p[4]; /*get yhe middle value and store every 3x3 matrix*/
}
}
for(m=0;m<x;m++)
{
for(n=0;n<y;n++)
{
w.val[0]=c[m][n]; //for blue
//w.val[1]=c[m][n]; //for green
// w.val[2]=c[m][n]; //for red
cvSet2D(image1,m,n,w);
}
}
/*
height = image->height;
width = image->width;
step = image->widthStep;
channels = image->nChannels;
data = (uchar *)image->imageData;
printf("Processing a %dx%d image with %d channels\n",height,width,channels); */
cvNamedWindow( "Show1", 1 );
cvShowImage( "Show1", image1 );
cvReleaseImage(&image);
cvReleaseImage(&image1);
cvWaitKey(0);
cvDestroyWindow("show");
cvDestroyWindow("show1");
return 0;
}
一个可能不是最简单的解决方案是将所有的w.val[0]存储在一个图像中,将w.val[1]存储在另一个图像中,将w.val[2]存储在最后一个图像中,这三个图像中的每一个都对应于通道B、G、R。然后可以使用cvMerge组合这三个图像 如果你不能这样做,只需评论这条消息,我将尝试编写更长的代码。。。
朱利安,我已经用过那个命令了,先生。问题是cvMerge命令仅用于单通道图像。但是,在我的程序中有3通道cvMerge标量输出图像。cvMergeconst CvArr*src0、const CvArr*src1、const CvArr*src2、const CvArr*src3、CvArr*dst;CvSet2D命令仅支持cvScalar结果