【问题标题】:Image compression using median filter in opencv but don't use median filter function在opencv中使用中值滤波器进行图像压缩但不使用中值滤波器功能
【发布时间】:2011-07-13 05:49:33
【问题描述】:

我使用 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"

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;
}

【问题讨论】:

    标签: c image-processing opencv


    【解决方案1】:

    一种可能不是最简单的解决方案可能是将所有 w.val[ 0 ] 存储在图像中,将 w.val[ 1 ] 存储在另一个图像中和最后一张中的w.val[2],这3张图像中的每一张都对应一个通道(B,G,R)。然后你可以使用 cvMerge() 合并这 3 个图像。

    See the doc of merge here, it's pretty easy to use

    如果您不能这样做,请评论此消息,我将尝试编写更长的代码... 朱利安,

    【讨论】:

    • 我已经使用了那个命令先生。问题是 cvMerge 命令仅用于单通道图像。但是,在我的程序中有 3 通道 cvScalar 输出图像。 cvMerge(const CvArr *src0,const CvArr *src1,const CvArr *src2,const CvArr *src3,CvArr *dst); CvSet2D 命令仅支持 cvScalar 结果
    猜你喜欢
    • 2020-01-28
    • 2013-08-27
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多