图像外推算法

#include "stdafx.h"
#include "ShapeExtend.h"

#include "MainFrm.h"
#include "NewFeatureofStormDoc.h"
#include "NewFeatureofStormView.h"


bool CShapeExtend::FlagOfRead=TRUE;
CShapeExtend::CShapeExtend()
 ://反射率对应的颜色表
 Refminus5to0(156,156,156),Ref0to5(118,118,118),Ref5to10(170,170,254),
 Ref10to15(140,140,238),Ref15to20(112,112,200),Ref20to25(144,250,0),
 Ref25to30(0,186,0),Ref30to35(112,254,254),Ref35to40(96,208,208),
 Ref40to45(96,96,254),Ref45to50(0,0,218),Ref50to55(0,0,174),
 Ref55to60(254,0,0),Ref60to65(254,254,160),Ref65to70(254,0,230),RefBlack(0,0,0)
 //, topbound(0)
 //, bottombound(0)
 //, leftbound(0)
 //, rightbound(0)
 //, rectcenter(0)
 , vecx(0)
 , vecy(0)
 , FlagOfReadBaseData(false)
 , crtcellorgpt(0)
 , lstcellorgpt(0)
 , nextrealorpt(0)
 , ccoeff(0)
 {
  
 
 
}

CShapeExtend::~CShapeExtend()
{
 
}
//============= 将原图像上的像素赋值给目标图像 =======================
//( 其中full表示是否完全复制,当为False时,原图像的黑色像素点不被复制 )
void CShapeExtend::MatCopy(const Mat& Src,Mat Dst,BOOL full)
{
 if (Src.data==NULL&&Dst.data==NULL)
 {
  //MessageBox("赋值时图像为空");
  return;
 }
 
 for (int Row=0;Row<Src.rows;Row++)
 {
  for (int Col=0;Col<Src.cols;Col++)
  {
   Point2i poi(Col,Row);
   
   if (full)
   {
    Dst.at<Vec3b>(poi)=Src.at<Vec3b>(poi);
   }
   else
   {
     Dst.at<BYTE>(poi)=Src.at<BYTE>(poi);
   }
  
  }
 }
}

//========从反射率值得到对应的颜色值============
Vec3b CShapeExtend::ReflectionValue(const int Ref)
{
 if (Ref>=-5&&Ref<0)
 {
  return Refminus5to0;
 }
 else if(Ref>=0&&Ref<5)
 {
  return Ref0to5;

 }
 else if(Ref>=5&&Ref<10)
 {
  return Ref5to10;
 }
 else if(Ref>=10&&Ref<15)
 {
  return Ref10to15;
 }
 else if(Ref>=15&&Ref<20)
 {
  return Ref15to20;
 }
 else if(Ref>=20&&Ref<25)
 {
  return Ref20to25;
 }
 else if(Ref>=25&&Ref<30)
 {
  return Ref25to30;
 }
 else if(Ref>=30&&Ref<35)
 {
  return Ref30to35;
 }
 else if(Ref>=35&&Ref<40)
 {
  return Ref35to40;
 }
 else if(Ref>=40&&Ref<45)
 {
  return Ref40to45;
 }
 else if(Ref>=45&&Ref<50)
 {
  return Ref45to50;
 }
 else if(Ref>=50&&Ref<55)
 {
  return Ref50to55;
 }
 else if(Ref>=55&&Ref<60)
 {
  return Ref55to60;
 }
 else if(Ref>=60&&Ref<65)
 {
  return Ref60to65;
 }
 else if(Ref>=65&&Ref<70)
 {
  return Ref65to70;
 }
 else
 {
  return RefBlack;
 }
}

//===============从像素颜色取得对应的反射率值=====================
//返回值为反射率范围的起始数值
int CShapeExtend::GetReflectionValue(Vec3b color)
{
 if(color==RefBlack)
 {
  return -10;
 }
 else if (color==Refminus5to0)
 {
  return -5;
 }
 else if(color==Ref0to5)
 {
  return 0;
 }
 else if(color==Ref5to10)
 {
  return 5;
 }
 else if(color==Ref10to15)
 {
  return 10;
 }
 else if(color==Ref15to20)
 {
  return 15;
 }
 else if(color==Ref20to25)
 {
  return 20;
 }
 else if(color==Ref25to30)
 {
  return 25;
 }
 else if(color==Ref30to35)
 {
  return 30;
 }
 else if(color==Ref35to40)
 {
  return 35;
 }
 else if(color==Ref40to45)
 {
  return 40;
 }
 else if(color==Ref45to50)
 {
  return 45;
 }
 else if(color==Ref50to55)
 {
  return 50;
 }
 else if(color==Ref55to60)
 {
  return 55;
 }
 else if(color==Ref60to65)
 {
  return 60;
 }
 else if(color==Ref65to70)
 {
  return 65;
 }
}

//================去除关注反射率范围外的反射率值=========
//反射率值过低的置成黑色,过高的置成阈值上限的颜色
void CShapeExtend::Filter(Mat Mat2P)
{
 for (int Row=0;Row<Mat2P.rows;++Row)//开始遍历图像
 {
  for (int Col=0;Col<Mat2P.cols;++Col)
  { 
   Point2i dot(Col,Row);
   int value=GetReflectionValue(Mat2P.at<Vec3b>(dot));
   if (value<25)//反射率在25以下的置成黑色
   {
    Mat2P.at<Vec3b>(dot)=RefBlack;
   }
   else if (value>55)//反射率在55以上的置成Ref55to60
   {
    Mat2P.at<Vec3b>(dot)=Ref55to60;
   }
  }
 }
}

//===================得到图像的7层单反射率层=============
void CShapeExtend::GetLayer(Mat srcMat)
{
 Mat25.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mat30.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mat35.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mat40.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mat45.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mat50.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mat55.create(srcMat.rows,srcMat.cols,CV_8UC3);
 Mattemp.create(srcMat.rows,srcMat.cols,CV_8UC3);
 MatCopy(srcMat,Mat25,1);
 MatCopy(srcMat,Mat30,1);
 MatCopy(srcMat,Mat35,1);
 MatCopy(srcMat,Mat40,1);
 MatCopy(srcMat,Mat45,1);
 MatCopy(srcMat,Mat50,1);
 MatCopy(srcMat,Mat55,1);
 MatCopy(srcMat,Mattemp,1);
 vector<Mat> MatLayer;  //定义Mat容器存放7层Mat图层
 MatLayer.clear();
 MatLayer.push_back(Mat25); //把7个Mat图层压入容器
 MatLayer.push_back(Mat30);
 MatLayer.push_back(Mat35);
 MatLayer.push_back(Mat40);
 MatLayer.push_back(Mat45);
 MatLayer.push_back(Mat50);
 MatLayer.push_back(Mat55);
 vector<Mat>::iterator ite_mat;//指向Mat容器的迭代器

 //vector<const char*> WindowName;//定义一容器存放窗口名称
 //const char* window1="25DBz分届图层";
 //const char* window2="30DBz分届图层";
 //const char* window3="35DBz分届图层";
 //const char* window4="40DBz分届图层";
 //const char* window5="45DBz分届图层";
 //const char* window6="50DBz分届图层";
 //const char* window7="55DBz分届图层";
 //WindowName.clear();
 //WindowName.push_back(window1);
 //WindowName.push_back(window2);
 //WindowName.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值