You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
6.4 KiB
293 lines
6.4 KiB
#include "twopoint.h" |
|
|
|
twoPoint::twoPoint(QObject *parent) |
|
: QObject{parent} |
|
{ |
|
thread = new QThread(); |
|
thread->start(); |
|
this->moveToThread(thread); |
|
ready = false; |
|
|
|
b_savelow = false; |
|
b_savehigh = false; |
|
n_savelow = 8; |
|
n_savehigh = 8; |
|
b_onepoint = false; |
|
vardim = 4; |
|
opnum = 0; |
|
c = 0; |
|
bdb = false; |
|
dbrange = 1; |
|
} |
|
|
|
void twoPoint::addlow(cv::Mat img, int id) |
|
{ |
|
cv::Mat temp; |
|
img.convertTo(temp,CV_32FC1,1.0/32.0); |
|
if(lowtemp.empty()){ |
|
// img.copyTo(lowtemp); |
|
// img.convertTo(lowtemp,CV_32FC1); |
|
lowtemp = temp; |
|
// lowtemp = lowtemp/8; |
|
} |
|
if(id == 0){ |
|
// img.convertTo(lowtemp,CV_32FC1); |
|
lowtemp = temp; |
|
} |
|
else if(id<32) { |
|
// lowtemp+= img; |
|
lowtemp+= temp; |
|
} |
|
else{ |
|
b_savelow = false; |
|
} |
|
} |
|
|
|
void twoPoint::addhigh(cv::Mat img, int id) |
|
{ |
|
cv::Mat temp; |
|
img.convertTo(temp,CV_32FC1,1.0/32.0); |
|
if(hightemp.empty()){ |
|
// img.copyTo(hightemp); |
|
// img.convertTo(hightemp,CV_32FC1); |
|
hightemp = temp; |
|
// lowtemp = lowtemp/8; |
|
} |
|
if(id == 0){ |
|
// hightemp = img/32; |
|
// img.convertTo(hightemp,CV_32FC1); |
|
hightemp = temp; |
|
} |
|
else if(id<32) { |
|
// hightemp+= img; |
|
hightemp += temp; |
|
} |
|
else{ |
|
b_savehigh = false; |
|
} |
|
} |
|
|
|
void twoPoint::onepoint(cv::Mat img) |
|
{ |
|
// ready = false; |
|
|
|
if(kmat.empty() || bmat.empty()){ |
|
return; |
|
} |
|
cv::Mat temp; |
|
img.convertTo(temp,CV_32FC1,1.0/32.0); |
|
if(opnum == 32){ |
|
temp.copyTo(bmat); |
|
} |
|
else{ |
|
bmat += temp; |
|
} |
|
|
|
opnum-=1; |
|
// if(opnum == 0){ |
|
// base = |
|
// } |
|
|
|
// cv::Mat dst = cv::Mat(img.rows,img.cols,CV_16UC1); |
|
// double sum = 0; |
|
// for(int i =0 ;i< img.rows;i++){ |
|
// for (int j = 0;j< img.cols;j++){ |
|
// int temp = kmat.at<float>(i,j)*img.at<ushort>(i,j)+bmat.at<float>(i,j); |
|
// if(temp<0) temp = 0; |
|
// if(temp>65535) temp = 65535; |
|
//// dst.at<ushort>(i,j) = temp; |
|
// sum+=temp; |
|
// } |
|
// } |
|
// sum = sum/img.rows/img.cols; |
|
|
|
|
|
// for(int i =0 ;i< img.rows;i++){ |
|
// for (int j = 0;j< img.cols;j++){ |
|
// bmat.at<float>(i,j) = sum-kmat.at<float>(i,j)*img.at<ushort>(i,j); |
|
// } |
|
// } |
|
|
|
/// k(i,j)*img(i,j)+b(i,j) = out(i,j) |
|
/// b'(i,j) = out^-k(i,j)*img(i,j) |
|
/// |
|
|
|
// ready = true; |
|
} |
|
|
|
void twoPoint::onepoint() |
|
{ |
|
b_onepoint = true; |
|
opnum = 32; |
|
} |
|
|
|
void twoPoint::calc() |
|
{ |
|
if(hightemp.empty() || lowtemp.empty()){ |
|
return; |
|
} |
|
kmat = cv::Mat(hightemp.rows,hightemp.cols,CV_32FC1); |
|
bmat = cv::Mat(hightemp.rows,hightemp.cols,CV_32FC1); |
|
// double |
|
high = 0,low = 0; |
|
for(int i = 0;i<hightemp.rows;i++){ |
|
for(int j = 0;j< hightemp.cols;j++){ |
|
high += hightemp.at<float>(i,j); |
|
low += lowtemp.at<float>(i,j); |
|
} |
|
} |
|
high = high/hightemp.total(); |
|
high = 16383*4; |
|
low = low/hightemp.total(); |
|
low = 0; |
|
/// (temp(i,j) - b(i,j))*k(i,j)+low = fix(i,j) |
|
/// low(i,j) = b(i,j) |
|
/// (high(i,j) - b(i,j))*k(i,j) = high - low |
|
/// k(i,j) = (high-low)/(high(i,j)-low(i,j)) |
|
/// base = low |
|
|
|
for(int i = 0;i<hightemp.rows;i++){ |
|
for(int j = 0;j<hightemp.cols;j++){ |
|
kmat.at<float>(i,j) =(high-low)/(hightemp.at<float>(i,j)-lowtemp.at<float>(i,j)); |
|
// bmat.at<float>(i,j) = low - lowtemp.at<ushort>(i,j)*kmat.at<float>(i,j); |
|
bmat.at<float>(i,j) = lowtemp.at<float>(i,j); |
|
} |
|
} |
|
kmean = cv::mean(kmat)[0]; |
|
base = low; |
|
ready =true; |
|
} |
|
|
|
void twoPoint::savek() |
|
{ |
|
if(ready) |
|
cv::imwrite("k.tiff",kmat); |
|
} |
|
|
|
void twoPoint::saveb() |
|
{ |
|
if(ready) |
|
cv::imwrite("b.tiff",bmat); |
|
} |
|
|
|
void twoPoint::savelow() |
|
{ |
|
ready = false; |
|
b_savelow = true; |
|
n_savelow = 0; |
|
} |
|
|
|
void twoPoint::savehigh() |
|
{ |
|
ready = false; |
|
b_savehigh = true; |
|
n_savehigh = 0; |
|
} |
|
|
|
void twoPoint::on(cv::Size s) |
|
{ |
|
if(kmat.empty()|| bmat.empty()) |
|
{ |
|
kmat = cv::Mat(s,CV_32FC1); |
|
bmat = cv::Mat(s,CV_32FC1); |
|
for(int i = 0;i<s.height;i++){ |
|
for(int j = 0;j<s.width;j++){ |
|
kmat.at<float>(i,j) = 1; |
|
bmat.at<float>(i,j) = 0; |
|
} |
|
} |
|
base = 0; |
|
} |
|
ready = true; |
|
} |
|
|
|
void twoPoint::off() |
|
{ |
|
ready = false; |
|
} |
|
|
|
void twoPoint::loaddata() |
|
{ |
|
kmat = cv::imread("k.tiff",cv::IMREAD_UNCHANGED); |
|
bmat = cv::imread("b.tiff",cv::IMREAD_UNCHANGED); |
|
if(kmat.empty() || bmat.empty()){ |
|
return; |
|
} |
|
ready = true; |
|
} |
|
|
|
void twoPoint::setdim(int value) |
|
{ |
|
vardim = value; |
|
} |
|
|
|
void twoPoint::savedata() |
|
{ |
|
c+=1; |
|
cv::imwrite( "high"+QString::number(c).toStdString()+".tiff",hightemp); |
|
cv::imwrite("low"+QString::number(c).toStdString()+".tiff",lowtemp); |
|
} |
|
|
|
void twoPoint::dbon() |
|
{ |
|
bdb = true; |
|
} |
|
|
|
void twoPoint::dboff() |
|
{ |
|
bdb = false; |
|
} |
|
|
|
void twoPoint::setpara(double range) |
|
{ |
|
this->dbrange = range; |
|
} |
|
|
|
void twoPoint::slotprocimg(cv::Mat img) |
|
{ |
|
|
|
img = img/vardim; |
|
img = img*vardim; |
|
|
|
|
|
if(b_savelow){ |
|
addlow(img,n_savelow); |
|
n_savelow+=1; |
|
} |
|
if(b_savehigh){ |
|
addhigh(img,n_savehigh); |
|
n_savehigh += 1; |
|
} |
|
if(b_onepoint & (opnum>0)){ |
|
onepoint(img); |
|
// b_onepoint = false; |
|
} |
|
if(ready){ |
|
cv::Mat dst = cv::Mat(img.rows,img.cols,CV_16UC1); |
|
for(int i =0 ;i< img.rows;i++){ |
|
for (int j = 0;j< img.cols;j++){ |
|
int temp = kmat.at<float>(i,j)*(img.at<ushort>(i,j)-bmat.at<float>(i,j))+base; |
|
if(temp<low) temp = low; |
|
// if(temp>65535) temp = 65535; |
|
if(temp>high) temp = high; |
|
dst.at<ushort>(i,j) = temp; |
|
} |
|
} |
|
if(bdb){ |
|
for(int i =0 ;i< img.rows;i++){ |
|
for (int j = 1;j< img.cols;j++){ |
|
|
|
if((kmat.at<float>(i,j)/kmean-dbrange<1) && (kmat.at<float>(i,j)/kmean+dbrange>1)) |
|
continue; |
|
dst.at<ushort>(i,j) = dst.at<ushort>(i,j-1); |
|
} |
|
} |
|
} |
|
emit signalsendimg(dst); |
|
} |
|
else{ |
|
cv::Mat temp; |
|
img.copyTo(temp); |
|
emit signalsendimg(temp); |
|
} |
|
}
|
|
|