Diplom_29-06 (1221240), страница 11
Текст из файла (страница 11)
int B = (float)channelsYUV420_YUV[0].at<uchar>(i,j) + 2.03211 * ((float)channelsYUV420_YUV[1].at<uchar>(i,j)-128);
//int B = (float)channelsYUV420_YUV[0].at<uchar>(i,j) + 1.772 * ((float)channelsYUV420_YUV[1].at<uchar>(i,j)-128);
if (B>255) B=255;
if (B<0) B=0;
ChannelsInOutput[0].at<uchar>(i,j)=(uchar)R;
ChannelsInOutput[1].at<uchar>(i,j)=(uchar)G;
ChannelsInOutput[2].at<uchar>(i,j)=(uchar)B;
}
}
wxString mystring4 = wxString::Format(wxT("%d%s"), imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows," байт");
StaticText4->SetLabelText(mystring4);
wxString mystring5 = wxString::Format(wxT("%d%s"), imageYUV420_YUV.channels()*imageYUV420_YUV.cols*imageYUV420_YUV.rows," байт");
StaticText5->SetLabelText(mystring5);
wxString mystringR = wxString::Format(wxT("%f"), 1.0 );
StaticTextRatio->SetLabelText(mystringR);
if (CheckBox1->GetValue()==true)
{
cvNamedWindow("Y", CV_WINDOW_AUTOSIZE);
cv::imshow("Y", channelsYUV420_YUV[0]);
cvNamedWindow("U", CV_WINDOW_AUTOSIZE);
cv::imshow("U", channelsYUV420_YUV[1]);
cvNamedWindow("V", CV_WINDOW_AUTOSIZE);
cv::imshow("V", channelsYUV420_YUV[2]);
}
cv::merge(channelsYUV420_YUV,imageYUV420_YUV);
cv::resize(imageYUV420_YUV, imageYUV420_YUV, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage2 = wxImage(imageYUV420_YUV.cols, imageYUV420_YUV.rows, imageYUV420_YUV.data, true);
wxBitmap bitmap2 = wxBitmap(aswxImage2);
StaticBitmap2->SetBitmap(bitmap2);
break;
}
case 3: ///YUV + ДИКМ
{
cv::Mat imageYUV420_YUV = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC3 );
std::vector<cv::Mat> channelsYUV420_YUV;
cv::split(imageYUV420_YUV,channelsYUV420_YUV);
cv::Mat imageDiff = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8SC3 );
std::vector<cv::Mat> channelsDiff;
cv::split(imageDiff,channelsDiff);
///Перевод в цветовую раскладку YUV
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols; j++ )
{
int R=ChannelsInInput[0].at<uchar>(i,j);
int G=ChannelsInInput[1].at<uchar>(i,j);
int B=ChannelsInInput[2].at<uchar>(i,j);
channelsYUV420_YUV[0].at<uchar>(i,j)=0.299*R+0.587*G+0.114*B;
channelsYUV420_YUV[1].at<uchar>(i,j)=-0.14713*R-0.28886*G+0.436*B+128;
channelsYUV420_YUV[2].at<uchar>(i,j)=0.615*R-0.51499*G-0.10001*B+128;
}
}
///Архивирование
int digY=SpinCtrl1->GetValue();
int digUV=SpinCtrl2->GetValue();
int levlY=pow(2.,digY)-1;
int levlUV=pow(2.,digUV)-1;
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols-1; j++ )
{
channelsDiff[0].at<char>(i,j)=(int)channelsYUV420_YUV[0].at<uchar>(i,j+1)-(int)channelsYUV420_YUV[0].at<uchar>(i,j);
if (channelsDiff[0].at<char>(i,j)>levlY) channelsDiff[0].at<char>(i,j)=levlY;
if (channelsDiff[0].at<char>(i,j)<-levlY) channelsDiff[0].at<char>(i,j)=-levlY;
channelsDiff[1].at<char>(i,j)=(int)channelsYUV420_YUV[1].at<uchar>(i,j+1)-(int)channelsYUV420_YUV[1].at<uchar>(i,j);
if (channelsDiff[1].at<char>(i,j)>levlUV) channelsDiff[1].at<char>(i,j)=levlUV;
if (channelsDiff[1].at<char>(i,j)<-levlUV) channelsDiff[1].at<char>(i,j)=-levlUV;
channelsDiff[2].at<char>(i,j)=(int)channelsYUV420_YUV[2].at<uchar>(i,j+1)-(int)channelsYUV420_YUV[2].at<uchar>(i,j);
if (channelsDiff[2].at<char>(i,j)>levlUV) channelsDiff[2].at<char>(i,j)=levlUV;
if (channelsDiff[2].at<char>(i,j)<-levlUV) channelsDiff[2].at<char>(i,j)=-levlUV;
}
}
if (CheckBox1->GetValue()==true)
{
cvNamedWindow("Y", CV_WINDOW_AUTOSIZE);
cv::imshow("Y", channelsDiff[0]);
cvNamedWindow("U", CV_WINDOW_AUTOSIZE);
cv::imshow("U", channelsDiff[1]);
cvNamedWindow("V", CV_WINDOW_AUTOSIZE);
cv::imshow("V", channelsDiff[2]);
}
cv::merge(channelsYUV420_YUV,imageYUV420_YUV);
cv::resize(imageYUV420_YUV, imageYUV420_YUV, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage2 = wxImage(imageYUV420_YUV.cols, imageYUV420_YUV.rows, imageYUV420_YUV.data, true);
wxBitmap bitmap2 = wxBitmap(aswxImage2);
StaticBitmap2->SetBitmap(bitmap2);
///разархивация
for( int i = 0; i < imageOUTPUT.rows; i++ )
{
ChannelsInOutput[0].at<uchar>(i,0)=channelsYUV420_YUV[0].at<uchar>(i,0);
ChannelsInOutput[1].at<uchar>(i,0)=channelsYUV420_YUV[1].at<uchar>(i,0);
ChannelsInOutput[2].at<uchar>(i,0)=channelsYUV420_YUV[2].at<uchar>(i,0);
for( int j = 0; j < imageOUTPUT.cols; j++ )
{
ChannelsInOutput[0].at<uchar>(i,j+1)=ChannelsInOutput[0].at<uchar>(i,j)+channelsDiff[0].at<uchar>(i,j);
ChannelsInOutput[1].at<uchar>(i,j+1)=ChannelsInOutput[1].at<uchar>(i,j)+channelsDiff[1].at<uchar>(i,j);
ChannelsInOutput[2].at<uchar>(i,j+1)=ChannelsInOutput[2].at<uchar>(i,j)+channelsDiff[2].at<uchar>(i,j);
}
}
for( int i = 0; i < imageOUTPUT.rows; i++ )
{
for( int j = 0; j < imageOUTPUT.cols; j++ )
{
int R = (float)ChannelsInOutput[0].at<uchar>(i,j) + 1.13983 * ((float)ChannelsInOutput[2].at<uchar>(i,j)-128);
if (R>255) R=255; if (R<0) R=0;
int G = (float)ChannelsInOutput[0].at<uchar>(i,j) -0.39465 * ((float)ChannelsInOutput[1].at<uchar>(i,j)-128) - 0.58060 * ((float)ChannelsInOutput[2].at<uchar>(i,j)-128);
if (G>255) G=255; if (G<0) G=0;
int B = (float)ChannelsInOutput[0].at<uchar>(i,j) + 2.03211 * ((float)ChannelsInOutput[1].at<uchar>(i,j)-128);
if (B>255) B=255;
if (B<0) B=0;
ChannelsInOutput[0].at<uchar>(i,j)=(uchar)R;
ChannelsInOutput[1].at<uchar>(i,j)=(uchar)G;
ChannelsInOutput[2].at<uchar>(i,j)=(uchar)B;
}
}
wxString mystring4 = wxString::Format(wxT("%d%s"), imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows," байт");
StaticText4->SetLabelText(mystring4);
wxString mystring5 = wxString::Format(wxT("%d%s"), (imageDiff.cols*imageDiff.rows*(digY+1)-imageDiff.cols + imageDiff.cols*imageDiff.rows*(digUV+1)*2-imageDiff.cols*2 )/8 + imageDiff.cols," байт");
StaticText5->SetLabelText(mystring5);
wxString mystringR = wxString::Format(wxT("%f"), (float)(imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows)/(float)((imageDiff.cols*imageDiff.rows*(digY+1)-imageDiff.cols + imageDiff.cols*imageDiff.rows*(digUV+1)*2-imageDiff.cols*2 )/8 + imageDiff.cols));
StaticTextRatio->SetLabelText(mystringR);
break;
}
default:
{
break;
}
}
unsigned long sum=0;
int maximux=0;
unsigned long updata=0;
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols; j++ )
{
int Ro=(int)ChannelsInOutput[0].at<uchar>(i,j);
int Go=(int)ChannelsInOutput[1].at<uchar>(i,j);
int Bo=(int)ChannelsInOutput[2].at<uchar>(i,j);
int dR=(int)ChannelsInInput[0].at<uchar>(i,j)-Ro;
int dG=(int)ChannelsInInput[1].at<uchar>(i,j)-Go;
int dB=(int)ChannelsInInput[2].at<uchar>(i,j)-Bo;
sum=sum + dR*dR+dG*dG+dB*dB;
if (dR>maximux) maximux=dR;
if (dG>maximux) maximux=dG;
if (dB>maximux) maximux=dB;
updata+=Ro*Ro+Go+Go+Bo+Bo;
}
}
///Построение гистрограммы
if (CheckBox2->GetValue()==true)
{
int channelHist;
if (RadioButton1->GetValue()==true) channelHist=0;
if (RadioButton2->GetValue()==true) channelHist=1;
if (RadioButton3->GetValue()==true) channelHist=2;
cv::Mat r_hist, r_hist_out;
int histSize = 256;
bool uniform = true;
bool accumulate = false;
float range[] = { 0, 256 } ;
const float* histRange = { range };
calcHist( &ChannelsInInput[channelHist], 1, 0, cv::Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
calcHist( &ChannelsInOutput[channelHist], 1, 0, cv::Mat(), r_hist_out, 1, &histSize, &histRange, uniform, accumulate );
int hist_w = 512;
int hist_h = 400;
int bin_w = cvRound( (double) hist_w/histSize );
cv::Mat histImage( hist_h, hist_w, CV_8UC3, cv::Scalar( 255,255,255) );
normalize(r_hist, r_hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat() );
normalize(r_hist_out, r_hist_out, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat() );
cv::Scalar sc1,sc2;
if (channelHist==0)
{
sc1=cv::Scalar( 0, 0, 255);
sc2=cv::Scalar( 0, 0, 128);
};
if (channelHist==1)
{
sc1=cv::Scalar( 0, 255, 0);
sc2=cv::Scalar( 0, 128, 0);
};
if (channelHist==2)
{
sc1=cv::Scalar( 255, 0, 0);
sc2=cv::Scalar( 128, 0, 0);
};
for( int i = 1; i < histSize; i++ )
{
line( histImage, cv::Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
cv::Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
sc2, 2, 8, 0 );
line( histImage, cv::Point( bin_w*(i-1), hist_h - cvRound(r_hist_out.at<float>(i-1)) ) ,
cv::Point( bin_w*(i), hist_h - cvRound(r_hist_out.at<float>(i)) ),
sc1, 1, 8, 0 );
}
cvNamedWindow("Histograms", CV_WINDOW_AUTOSIZE);
cv::imshow("Histograms", histImage);
}
cv::merge(ChannelsInOutput,imageOUTPUT);
float div=sum/imageINPUT.rows*imageINPUT.cols;
float updiv=updata/imageINPUT.rows*imageINPUT.cols;
div=sqrt(div); ///RMSE
updiv=sqrt(updiv)/div;
double SNR = log10(updiv)*20;
double PSNR = pow(255,2)*imageINPUT.rows*imageINPUT.cols/sum;
PSNR=log10(PSNR)*10;
wxString mystring = wxString::Format(wxT("%f"), div);
StaticTextQuality->SetLabelText(mystring);
wxString mystring2 = wxString::Format(wxT("%d"), maximux);
StaticText2->SetLabelText(mystring2);
wxString mystring3 = wxString::Format(wxT("%f"), PSNR);
StaticText3->SetLabelText(mystring3);
wxString mystringSNR = wxString::Format(wxT("%f"), SNR);
StaticTextSNR->SetLabelText(mystringSNR);
cv::resize(imageINPUT, imageINPUT, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage = wxImage(imageINPUT.cols, imageINPUT.rows, imageINPUT.data, true);
wxBitmap bitmap = wxBitmap(aswxImage);
StaticBitmap1->SetBitmap(bitmap);
if (CheckBox3->GetValue()==true)
{
cvtColor( imageOUTPUT, imageOUTPUT, CV_RGB2BGR );
imwrite( "C:\\decodedImage.jpg", imageOUTPUT );
cvtColor( imageOUTPUT, imageOUTPUT, CV_BGR2RGB );
}
cv::resize(imageOUTPUT, imageOUTPUT, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage3 = wxImage(imageOUTPUT.cols, imageOUTPUT.rows, imageOUTPUT.data, true);
wxBitmap bitmap3 = wxBitmap(aswxImage3);
StaticBitmap3->SetBitmap(bitmap3);
}
void PRJ_ON_OCVFrame::OnChoice1Select(wxCommandEvent& event)
{
if (Choice1->GetSelection()==3){
SpinCtrl1->Show(true);
SpinCtrl2->Show(true);
StaticText16->Show(true);
StaticText17->Show(true);
}
else {
SpinCtrl1->Show(false);
SpinCtrl2->Show(false);
StaticText16->Show(false);
StaticText17->Show(false);
}
}
void PRJ_ON_OCVFrame::OnButton3Click(wxCommandEvent& event)
{
wxString caption = wxT("asd");
wxString wildcard = wxT("JPG files (*.jpg)|*.jpg|BMP files (*.bmp)|*.bmp");
wxString defaultDir = wxT("");
wxString defaultFilename = wxEmptyString;
wxFileDialog dialog(0, caption, defaultDir, defaultFilename, wildcard, 0);
if (dialog.ShowModal() == wxID_OK)
{
path = dialog.GetPath();
int filterIndex = dialog.GetFilterIndex();
}
imageBase.~Mat();
imageBase = cv::imread(path.ToStdString(), CV_LOAD_IMAGE_ANYCOLOR );
cvtColor(imageBase, imageBase, CV_BGR2RGB);
cv::Mat imageForShow = imageBase;
cv::resize(imageForShow, imageForShow, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage = wxImage(imageForShow.cols, imageForShow.rows, imageForShow.data, true);
wxBitmap bitmap = wxBitmap(aswxImage);
StaticBitmap1->SetBitmap(bitmap);
}















