①cvLine等で描写した図をDCTする。
②画像を読み込みDCTする。
処理の部分はまったく変更せず、ソース画像を変えただけなのですが二つの結果が違う結果となります。
また①のほうが正しく出力されています。
これはどうしてなのでしょうか?
どなたかご指摘いただきたいです。
以下ソースとなります、よろしくお願いしますm(__)m
①
#include "opencv/cv.h"
#include "opencv/cxcore.h"
#include "opencv/highgui.h"
#define PI 3.1415926
//////////////////////////////////////////////////////////////////////////////
///DCT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
void DCT(IplImage *src=0,IplImage*image=0,IplImage*dctImage=0){
int x,y;
cvCvtColor(src,image,CV_BGR2GRAY);
double CosTable[8][8] = {0.0};
double SqrtValue = 1.0/sqrt(2.0);
double Cu, Cv = 0.0;
double DCTValue = 0.0;
CvMat*DCTImage=0;
DCTImage = cvCreateMat(image->height, image->width, CV_64FC1);
int a, b, i, j, u, v;
//make cosTable
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
CosTable[i][j] = cos(PI * (2.0 * (double)j + 1.0)* (double)i / 16.0);
}
}
//DCT
for(a = 0; a < image->height; a += 8){
for(b = 0; b < image->width; b += 8){
for(u = 0; u < 8; u++){
if(u == 0){
Cu = SqrtValue;
}
else{
Cu = 1.0;
}
for(v = 0; v < 8; v++){
DCTValue = 0.0;
if(v == 0){
Cv = SqrtValue;
}
else{
Cv = 1.0;
}
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
DCTValue += image->imageData[ image->widthStep*(a + i)+ b + j]* CosTable[u][i] * CosTable[v][j];
}
}
cvmSet(DCTImage,a+u,b+v,Cu*Cv*DCTValue);
}
}
}
}
for(y=0; y<dctImage->height; y++){
for(x=0; x<dctImage->width; x++){
dctImage->imageData[dctImage->widthStep * y + x] =(unsigned char)cvmGet(DCTImage,y,x);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////
////////////main////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv){
////Size
int width = 640;
int height = 480;
////IplImage
IplImage*dct=0,*gray=0;
IplImage*src=0;
int key;
int n = 0;
////make IplImage
src=cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
gray=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
dct=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
////make window name
cvNamedWindow("Line Sample", CV_WINDOW_AUTOSIZE);
cvNamedWindow("DCT", CV_WINDOW_AUTOSIZE);
////Drow Line
cvSetZero(src);
cvLine(src, cvPoint(0, height/2), cvPoint(width,height/2), cvScalar(255, 0, 0), 1, 8, 0);
//cvLine(src, cvPoint(0,2), cvPoint(WIDTH-2, HEIGHT), cvScalar(255, 0, 0), 1, 8, 0);
//cvLine(src, cvPoint(2, 0), cvPoint(WIDTH, HEIGHT-2), cvScalar(255, 0, 0), 1, 8, 0);
////DCT
IplImage*tmp=cvCloneImage(src);
DCT(tmp,gray,dct);
////Save Images
//cvSaveImage("test.jpg",src);
//cvSaveImage("test_DCT.jpg",dct);
//maek window roop
while(true){
cvShowImage("Line Sample", src);
cvShowImage("DCT", dct);
//key
key = cvWaitKey(10);
//End@ESC_key
if(key==0x1b)
break;
}
//Release
cvDestroyWindow("Line Sample");
cvDestroyWindow("DCT");
return 0;
}
#include "opencv/cv.h"
#include "opencv/cxcore.h"
#include "opencv/highgui.h"
#define PI 3.1415926
//////////////////////////////////////////////////////////////////////////////
///DCT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
void DCT(IplImage *src=0,IplImage*image=0,IplImage*dctImage=0){
int x,y;
cvCvtColor(src,image,CV_BGR2GRAY);
double CosTable[8][8] = {0.0};
double SqrtValue = 1.0/sqrt(2.0);
double Cu, Cv = 0.0;
double DCTValue = 0.0;
CvMat*DCTImage=0;
DCTImage = cvCreateMat(image->height, image->width, CV_64FC1);
int a, b, i, j, u, v;
//make cosTable
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
CosTable[i][j] = cos(PI * (2.0 * (double)j + 1.0)* (double)i / 16.0);
}
}
//DCT
for(a = 0; a < image->height; a += 8){
for(b = 0; b < image->width; b += 8){
for(u = 0; u < 8; u++){
if(u == 0){
Cu = SqrtValue;
}
else{
Cu = 1.0;
}
for(v = 0; v < 8; v++){
DCTValue = 0.0;
if(v == 0){
Cv = SqrtValue;
}
else{
Cv = 1.0;
}
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
DCTValue += image->imageData[ image->widthStep*(a + i)+ b + j]* CosTable[u][i] * CosTable[v][j];
}
}
cvmSet(DCTImage,a+u,b+v,Cu*Cv*DCTValue);
}
}
}
}
for(y=0; y<dctImage->height; y++){
for(x=0; x<dctImage->width; x++){
dctImage->imageData[dctImage->widthStep * y + x] =(unsigned char)cvmGet(DCTImage,y,x);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////
////////////main////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv){
////Size
int WIDTH = 640;
int HEIGHT = 480;
////IplImage
IplImage*dct=0,*gray=0;
IplImage*src=cvLoadImage("src.jpg",CV_LOAD_IMAGE_COLOR);
int key;
int n = 0;
////make IplImage
gray=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
dct=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
////make window name
cvNamedWindow("Line Sample", CV_WINDOW_AUTOSIZE);
cvNamedWindow("DCT", CV_WINDOW_AUTOSIZE);
////DCT
IplImage*tmp=cvCloneImage(src);
DCT(tmp,gray,dct);
////Save Images
//cvSaveImage("test.jpg",src);
//cvSaveImage("test_DCT.jpg",dct);
//maek window roop
while(true){
cvShowImage("Line Sample", src);
cvShowImage("DCT", dct);
//key
key = cvWaitKey(10);
//End@ESC_key
if(key==0x1b)
break;
}
//Release
cvDestroyWindow("Line Sample");
cvDestroyWindow("DCT");
return 0;
}