비 나 필터 운동 퍼 지 이미지 복원
48853 단어 Opencv이미지 처리-퍼 지 제거
포럼:http://bbs.csdn.net/topics/390338193
코드:http://download.csdn.net/detail/suseyaoyao/4976475
우선 이 높 은 분 의 공유 에 감 사 드 립 니 다!코드 를 실행 해 보 니 해결 해 야 할 몇 가지 문제 가 있 습 니 다.첫째,이미지 의 모호 한 거리 와 모호 한 각 도 는 자신 이 다른 적당 한 방법 으로 평가 해 야 합 니 다.둘째,테스트 를 통 해 모호 한 각도 가 예각 일 때 이 코드 는 완전히 가능 합 니 다.모호 한 각도 가 다른 수치 일 때 메모리 오류 가 발생 할 수 있 습 니 다.저 는 모호 한 크기 와 모호 한 각도 에 따라 확산 함 수 를 얻 는 방법 을 알 아 보 려 고 했 습 니 다.부 끄 럽 고 마지막 에 코드 의 방향 을 이해 하지 못 했 습 니 다.다음은 코드 와 실행 결 과 를 붙 이 고 지나 가 는 새우 들 에 게 코드 를 어떻게 개선 하여 임의의 모호 한 각도 의 모호 한 이미 지 를 처리 할 수 있 는 지 가르쳐 주 십시오.그 중 에 그 void CYspecial(double len,double theta,CvMat *&h_last)함수 의 기능 은 모호 각도 와 모호 크기 에 따라 점 확산 함 수 를 얻 을 수 있 습 니 다.여러분,큰 신의 가르침 을 바 랍 니 다!(코드 가 길 어 보 이 는 것 은 내 가 컬러 사진 을 세 개의 채널 로 나 누 어 처리 하기 때문이다)
비 나 필터 코드:
#include
#include // int 32
#include
#include
#include "stdio.h"
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
#define eps 2.22044604925031e-016;
#define pi 3.1416;
#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
# pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")
# pragma comment(linker, "/NODEFAULTLIB:LIBCMT")
# pragma comment(linker, "/NODEFAULTLIB:MSVCRTD")
BOOL fourn(double * data/*psrc*/, unsigned long nn[]/*w*/, int ndim/*2*/, int isign);
double CY_sign(double cosphi);
void CYmeshgrid(int xm,int xn,int ym,int yn,CvMat* &X,CvMat* &Y);
void CY_special(double len,double theta,CvMat *&h_last);
void main(int argc, char argv[])
{
IplImage *RGB = cvLoadImage("D:\\images\\128.png",-1);
IplImage* redImage=cvCreateImage(cvGetSize(RGB),IPL_DEPTH_8U,1); //
IplImage* greenImage=cvCreateImage(cvGetSize(RGB),IPL_DEPTH_8U,1);
IplImage* blueImage=cvCreateImage(cvGetSize(RGB),IPL_DEPTH_8U,1);
cvSplit(RGB,blueImage,greenImage,redImage,NULL); // 。 :OpenCV :B,G,R
//cvNamedWindow("RGB");
//cvShowImage("RGB",RGB);
//
int bHeight = blueImage->height;
int bLineBytes = blueImage->widthStep;
int bw = 1;
int bh = 1;
// 2
while(bw*2 <= bLineBytes)
{
bw = bw*2;
}
while(bh*2 <= bHeight)
{
bh = bh*2;
}
// 2 ;
if(bw != (int)bLineBytes)
{
return;
}
if(bh != (int)bHeight)
{
return;
}
// FFT
double startime = (double)getTickCount(); // set the begining time
// j , i
double *fftSrc, *fftKernel, *laplacianKernel;
fftSrc = new double [bHeight*bLineBytes*2+1];
fftKernel = new double [bHeight*bLineBytes*2+1];
laplacianKernel = new double [bHeight*bLineBytes*2+1];
unsigned long nn[3] = {0};
nn[1] = bHeight;
nn[2] = bLineBytes;
LPSTR lpSrc;
unsigned char pixel;
double len = 15; //
double theta = 60; //
CvMat *h_last;
CY_special(len,theta,h_last);
int h_row = h_last->height;
int h_col = h_last->width;
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
// j , i
lpSrc = (char *)blueImage->imageData + bLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
fftSrc[(2*bLineBytes)*j + 2*i + 1] = (double)pixel;
fftSrc[(2*bLineBytes)*j + 2*i + 2] = 0.0;
laplacianKernel[(2*bLineBytes)*j + 2*i + 1] = 0.0;
laplacianKernel[(2*bLineBytes)*j + 2*i + 2] = 0.0;
if(i < h_col && j < h_row)
{
float h_value = CV_MAT_ELEM(*h_last,float,j,i);
fftKernel[(2*bLineBytes)*j + 2*i + 1] = double(h_value);
}
else
{
fftKernel[(2*bLineBytes)*j + 2*i + 1] = 0.0;
}
fftKernel[(2*bLineBytes)*j + 2*i + 2] = 0.0;
}
}
laplacianKernel[(2*bLineBytes)*0+2*1+1] = 1.0; //
laplacianKernel[(2*bLineBytes)*1+2*0+1] = 1.0;
laplacianKernel[(2*bLineBytes)*1+2*1+1] = -4.0;
laplacianKernel[(2*bLineBytes)*0+2*2+1] = 1.0;
laplacianKernel[(2*bLineBytes)*2+2*1+1] = 1.0;
// FFT
fourn(fftSrc,nn,2,1);
// FFT
fourn(fftKernel,nn,2,1);
// FFT;
fourn(laplacianKernel,nn,2,1);
double a,b,c,d,e,f,norm1,norm2,temp;
double gama = 0.05;
for (int i = 1;i *bLineBytes*2;i+=2)
{
a = fftSrc[i];
b = fftSrc[i+1];
c = fftKernel[i];
d = fftKernel[i+1];
e = laplacianKernel[i];
f = laplacianKernel[i+1];
// |H(u,v)|*|H(u,v)|+r|C(u,v)*C(u,v)|;
norm1 = c*c + d*d;
norm2 = e*e + f*f;
temp = norm1 + norm2*gama;
if (c*c + d*d > 1e-3)
{
fftSrc[i] = ( a*c + b*d ) /temp;
fftSrc[i+1] = ( b*c - a*d )/temp;
}
}
// FFT
fourn(fftSrc,nn,2,-1);
//
//
double MaxNum;
MaxNum = 0.0;
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
fftSrc[(2*bLineBytes)*j + 2*i + 1] =
sqrt(fftSrc[(2*bLineBytes)*j + 2*i + 1] * fftSrc[(2*bLineBytes)*j + 2*i + 1]/
+fftSrc[(2*bLineBytes)*j + 2*i + 2] * fftSrc[(2*bLineBytes)*j + 2*i + 2]);
if( MaxNum < fftSrc[(2*bLineBytes)*j + 2*i + 1])
MaxNum = fftSrc[(2*bLineBytes)*j + 2*i + 1];
}
}
//
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
// j , i
lpSrc = (char *)blueImage->imageData + bLineBytes * j + i;
*lpSrc = (unsigned char) (fftSrc[(2*bLineBytes)*j + 2*i + 1]*255.0/MaxNum);
}
}
//cvNamedWindow("blueImageDeblur");
//cvShowImage("blueImageDeblur",blueImage);
//
bLineBytes = greenImage->widthStep;
bw = 1;
bh = 1;
// 2
while(bw*2 <= bLineBytes)
{
bw = bw*2;
}
while(bh*2 <= bHeight)
{
bh = bh*2;
}
// 2 ;
if(bw != (int)bLineBytes)
{
return;
}
if(bh != (int)bHeight)
{
return;
}
// FFT
// j , i
fftSrc = new double [bHeight*bLineBytes*2+1];
fftKernel = new double [bHeight*bLineBytes*2+1];
laplacianKernel = new double [bHeight*bLineBytes*2+1];
CvMat *h_last2;
CY_special(len,theta,h_last2);
h_row = h_last2->height;
h_col = h_last2->width;
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
// j , i
lpSrc = (char *)greenImage->imageData + bLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
fftSrc[(2*bLineBytes)*j + 2*i + 1] = (double)pixel;
fftSrc[(2*bLineBytes)*j + 2*i + 2] = 0.0;
laplacianKernel[(2*bLineBytes)*j + 2*i + 1] = 0.0;
laplacianKernel[(2*bLineBytes)*j + 2*i + 2] = 0.0;
if(i < h_col && j < h_row)
{
float h_value = CV_MAT_ELEM(*h_last2,float,j,i);
fftKernel[(2*bLineBytes)*j + 2*i + 1] = double(h_value);
}
else
{
fftKernel[(2*bLineBytes)*j + 2*i + 1] = 0.0;
}
fftKernel[(2*bLineBytes)*j + 2*i + 2] = 0.0;
}
}
laplacianKernel[(2*bLineBytes)*0+2*1+1] = 1.0; //
laplacianKernel[(2*bLineBytes)*1+2*0+1] = 1.0;
laplacianKernel[(2*bLineBytes)*1+2*1+1] = -4.0;
laplacianKernel[(2*bLineBytes)*0+2*2+1] = 1.0;
laplacianKernel[(2*bLineBytes)*2+2*1+1] = 1.0;
// FFT
fourn(fftSrc,nn,2,1);
// FFT
fourn(fftKernel,nn,2,1);
// FFT;
fourn(laplacianKernel,nn,2,1);
for (int i = 1;i *bLineBytes*2;i+=2)
{
a = fftSrc[i];
b = fftSrc[i+1];
c = fftKernel[i];
d = fftKernel[i+1];
e = laplacianKernel[i];
f = laplacianKernel[i+1];
// |H(u,v)|*|H(u,v)|+r|C(u,v)*C(u,v)|;
norm1 = c*c + d*d;
norm2 = e*e + f*f;
temp = norm1 + norm2*gama;
if (c*c + d*d > 1e-3)
{
fftSrc[i] = ( a*c + b*d ) /temp;
fftSrc[i+1] = ( b*c - a*d )/temp;
}
}
// FFT
fourn(fftSrc,nn,2,-1);
//
//
MaxNum=0;
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
fftSrc[(2*bLineBytes)*j + 2*i + 1] =
sqrt(fftSrc[(2*bLineBytes)*j + 2*i + 1] * fftSrc[(2*bLineBytes)*j + 2*i + 1]/
+fftSrc[(2*bLineBytes)*j + 2*i + 2] * fftSrc[(2*bLineBytes)*j + 2*i + 2]);
if( MaxNum < fftSrc[(2*bLineBytes)*j + 2*i + 1])
MaxNum = fftSrc[(2*bLineBytes)*j + 2*i + 1];
}
}
//
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
// j , i
lpSrc = (char *)greenImage->imageData + bLineBytes * j + i;
*lpSrc = (unsigned char) (fftSrc[(2*bLineBytes)*j + 2*i + 1]*255.0/MaxNum);
}
}
//cvNamedWindow("greenImageDeblur");
//cvShowImage("greenImageDeblur",greenImage);
//
bLineBytes = redImage->widthStep;
bw = 1;
bh = 1;
// 2
while(bw*2 <= bLineBytes)
{
bw = bw*2;
}
while(bh*2 <= bHeight)
{
bh = bh*2;
}
// 2 ;
if(bw != (int)bLineBytes)
{
return;
}
if(bh != (int)bHeight)
{
return;
}
// FFT
// j , i
fftSrc = new double [bHeight*bLineBytes*2+1];
fftKernel = new double [bHeight*bLineBytes*2+1];
laplacianKernel = new double [bHeight*bLineBytes*2+1];
CvMat *h_last3;
CY_special(len,theta,h_last3);
h_row = h_last3->height;
h_col = h_last3->width;
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
// j , i
lpSrc = (char *)redImage->imageData + bLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
fftSrc[(2*bLineBytes)*j + 2*i + 1] = (double)pixel;
fftSrc[(2*bLineBytes)*j + 2*i + 2] = 0.0;
laplacianKernel[(2*bLineBytes)*j + 2*i + 1] = 0.0;
laplacianKernel[(2*bLineBytes)*j + 2*i + 2] = 0.0;
if(i < h_col && j < h_row)
{
float h_value = CV_MAT_ELEM(*h_last3,float,j,i);
fftKernel[(2*bLineBytes)*j + 2*i + 1] = double(h_value);
}
else
{
fftKernel[(2*bLineBytes)*j + 2*i + 1] = 0.0;
}
fftKernel[(2*bLineBytes)*j + 2*i + 2] = 0.0;
}
}
laplacianKernel[(2*bLineBytes)*0+2*1+1] = 1.0; //
laplacianKernel[(2*bLineBytes)*1+2*0+1] = 1.0;
laplacianKernel[(2*bLineBytes)*1+2*1+1] = -4.0;
laplacianKernel[(2*bLineBytes)*0+2*2+1] = 1.0;
laplacianKernel[(2*bLineBytes)*2+2*1+1] = 1.0;
// FFT
fourn(fftSrc,nn,2,1);
// FFT
fourn(fftKernel,nn,2,1);
// FFT;
fourn(laplacianKernel,nn,2,1);
for (int i = 1;i *bLineBytes*2;i+=2)
{
a = fftSrc[i];
b = fftSrc[i+1];
c = fftKernel[i];
d = fftKernel[i+1];
e = laplacianKernel[i];
f = laplacianKernel[i+1];
// |H(u,v)|*|H(u,v)|+r|C(u,v)*C(u,v)|;
norm1 = c*c + d*d;
norm2 = e*e + f*f;
temp = norm1 + norm2*gama;
if (c*c + d*d > 1e-3)
{
fftSrc[i] = ( a*c + b*d ) /temp;
fftSrc[i+1] = ( b*c - a*d )/temp;
}
}
// FFT
fourn(fftSrc,nn,2,-1);
//
//
MaxNum=0;
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
fftSrc[(2*bLineBytes)*j + 2*i + 1] =
sqrt(fftSrc[(2*bLineBytes)*j + 2*i + 1] * fftSrc[(2*bLineBytes)*j + 2*i + 1]/
+fftSrc[(2*bLineBytes)*j + 2*i + 2] * fftSrc[(2*bLineBytes)*j + 2*i + 2]);
if( MaxNum < fftSrc[(2*bLineBytes)*j + 2*i + 1])
MaxNum = fftSrc[(2*bLineBytes)*j + 2*i + 1];
}
}
//
for (int j = 0;j < bHeight ;j++)
{
for(int i = 0;i < bLineBytes ;i++)
{
// j , i
lpSrc = (char *)redImage->imageData + bLineBytes * j + i;
*lpSrc = (unsigned char) (fftSrc[(2*bLineBytes)*j + 2*i + 1]*255.0/MaxNum);
}
}
//cvNamedWindow("redImageDeblur");
//cvShowImage("redImageDeblur",redImage);
IplImage* MergedImage=cvCreateImage(cvGetSize(RGB),IPL_DEPTH_8U,3); //
cvMerge(blueImage,greenImage,redImage,0,MergedImage);
double durationtime = (double)getTickCount() - startime;
printf(" detection time = %g ms
", durationtime*1000./cv::getTickFrequency()); //calculate the running time
cvNamedWindow("Merged Image");
cvShowImage("Merged Image",MergedImage);
cvWaitKey();
}
BOOL fourn(double * data/*psrc*/, unsigned long nn[]/*w*/, int ndim/*2*/, int isign)
{
int idim;
unsigned long i1,i2,i3,i2rev,i3rev,ip1,ip2,ip3,ifp1,ifp2;
unsigned long ibit,k1,k2,n,nprev,nrem,ntot;
double tempi,tempr;
double theta,wi,wpi,wpr,wr,wtemp;
for (ntot=1,idim=1;idim<=ndim;idim++)
ntot *= nn[idim];
nprev=1;
for (idim=ndim;idim>=1;idim--) {
n=nn[idim];
nrem=ntot/(n*nprev);
ip1=nprev << 1;
ip2=ip1*n;
ip3=ip2*nrem;
i2rev=1;
for (i2=1;i2<=ip2;i2+=ip1) {
if (i2 < i2rev) {
for (i1=i2;i1<=i2+ip1-2;i1+=2) {
for (i3=i1;i3<=ip3;i3+=ip2) {
i3rev=i2rev+i3-i2;
SWAP(data[i3],data[i3rev]);
SWAP(data[i3+1],data[i3rev+1]);
}
}
}
ibit=ip2 >> 1;
while (ibit >= ip1 && i2rev > ibit) {
i2rev -= ibit;
ibit >>= 1;
}
i2rev += ibit;
}
ifp1=ip1;
while (ifp1 < ip2) {
ifp2=ifp1 << 1;
theta=isign*6.28318530717959/(ifp2/ip1);
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0;
wi=0.0;
for (i3=1;i3<=ifp1;i3+=ip1) {
for (i1=i3;i1<=i3+ip1-2;i1+=2) {
for (i2=i1;i2<=ip3;i2+=ifp2) {
k1=i2;
k2=k1+ifp1;
tempr=wr*data[k2]-wi*data[k2+1];
tempi=wr*data[k2+1]+wi*data[k2];
data[k2]=data[k1]-tempr;
data[k2+1]=data[k1+1]-tempi;
data[k1] += tempr;
data[k1+1] += tempi;
}
}
wr=(wtemp=wr)*wpr-wi*wpi+wr;
wi=wi*wpr+wtemp*wpi+wi;
}
ifp1=ifp2;
}
nprev *= n;
}
return true;
}
void CY_special(double len,double theta,CvMat *&h_last)
{
len = double(max(len,1.0));
double half = (len - 1)/2;
double phi = theta/180.0*pi;
double cosphi = cos(phi);
double sinphi = sin(phi);
double xsign = CY_sign(cosphi);
double linewdt = 1.0;
double sx = half*cosphi + linewdt*xsign - len*eps;
sx = cvFloor(sx);
double sy = half*sinphi +linewdt - len*eps;
sy = cvFloor(sy);
CvMat *X,*Y;
CYmeshgrid(0,int(sy),0,int(sx),X,Y);
int row = X->height;
int col = X->width;
CvMat *dist2line = cvCreateMat(row,col,CV_32FC1);
CvMat *rad = cvCreateMat(row,col,CV_32FC1);
CvMat *h = cvCreateMat(row,col,CV_32FC1);
cvZero(dist2line);
cvAddWeighted(Y,cosphi,X,-sinphi,0,dist2line);
cvCartToPolar(X,Y,rad,NULL,0);
for(int i = 0;ifor(int j = 0;j*rad,float,i,j);
float temp2 = CV_MAT_ELEM(*dist2line,float,i,j);
temp2 = abs(temp2);
if(temp1 >= half && temp2 <= linewdt)
{
float x_value = CV_MAT_ELEM(*X,float,i,j);
float dist_value = CV_MAT_ELEM(*dist2line,float,i,j);
float dist_value1 = (x_value + dist_value*float(sinphi))/float(cosphi);
float x2lastpix_cy1 = float(half) - abs(dist_value1);
float cy = dist_value*dist_value + x2lastpix_cy1*x2lastpix_cy1;
float cy1 = cvSqrt(cy);
cvmSet(dist2line,i,j,cy1);
}
}
}
for(int i = 0;ifor(int j = 0;j*dist2line,float,i,j);
cy2 = float(linewdt) + float(0.00000000001) - abs(cy2);
cvmSet(dist2line,i,j,cy2);
if(cy2<0)
{
cvmSet(dist2line,i,j,0.0);
}
}
}
cvFlip(dist2line,h,1);
cvFlip(h,NULL,0);
int row_h = row + row - 1;
int col_h = col + col - 1;
//CvMat *h_last = cvCreateMat(row_h,col_h,CV_32FC1);
h_last = cvCreateMat(row_h,col_h,CV_32FC1);
cvZero(h_last);
for(int i = 0;ifor(int j = 0;j*h,float,i,j);
cvmSet(h_last,i,j,h_value);
}
}
// dist2line h
int p =0;
for(int i = row-1;iint q =0;
for(int j = col-1;j*dist2line,float,p,q);
cvmSet(h_last,i,j,h_temp);
q++;
}
p++;
}
double yao_value = len*len*eps;
CvScalar sum = cvSum(h_last);
double yao_sum = sum.val[0];
double yaoyao = 1/(yao_value + yao_sum);
cvConvertScale(h_last,h_last,yaoyao,0);
if(cosphi > 0)
{
cvFlip(h_last,NULL,0);
}
}
double CY_sign(double cosphi)
{
double dst_value = 0;
if(cosphi>0)
{
dst_value = 1;
}
else
{
dst_value = -1;
}
return dst_value;
}
void CYmeshgrid(int xm,int xn,int ym,int yn,CvMat* &X,CvMat* &Y)
{
int m=xn-xm+1;
int n=yn-ym+1;
X=cvCreateMat(m,n,CV_32FC1);
Y=cvCreateMat(m,n,CV_32FC1);
float cy2=float(xm);
for(int i=0;i<m;i++)
{
float cy1=float(xm);
for(int j=0;j1;
}
cy2=cy2+1;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Opencv 학습 노트 (2): Opencv 의 기본 데이터 형식 과 데이터 구조매트릭스 데이터 형식: C 언어 에서 2 차원 데이터 중의 데이터 형식, 예 를 들 어 int, float, char 등 과 같다.Opencv 에서 행렬 의 데이터 형식 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.