twain2/hugaotwainds/ImageChannel.cpp

185 lines
3.8 KiB
C++
Raw Normal View History

#include "StdAfx.h"
#include "ImageChannel.h"
using namespace cv;
CImageChannel::CImageChannel(int index)
: m_cmIndex(index)
{
colorTable=NULL;
if (index>3)
{
short channal=m_cmIndex==4?2:(m_cmIndex==5?1:0);
InitColorTable(channal);
}
}
CImageChannel::~CImageChannel(void)
{
if (colorTable!=NULL)
{
free(colorTable);
}
}
void CImageChannel::apply(cv::Mat& pDib,int side)
{
if (m_cmIndex>0&&m_cmIndex<4)
{
if (m_cmIndex <= pDib.channels())
{
//0ͨ<30><CDA8>ΪB<CEAA><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><31><CDA8>ΪG<CEAA><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD><32><CDA8>ΪR<CEAA><52><EFBFBD><EFBFBD>
//m_cmIndex 1 <20><><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD> 3 <20><><EFBFBD><EFBFBD>
//2<><32><EFBFBD>죬1<ECA3AC><31><EFBFBD>̣<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>
//std::vector<cv::Mat> mats;
//cv::split(pDib, mats);
//int rmIndex=m_cmIndex==1?2:(m_cmIndex==2?1:0);
//pDib = mats[rmIndex];
pDib=FilterColor(pDib,m_cmIndex==1?2:(m_cmIndex==2?1:0));
}
}
else if(m_cmIndex>=4&&m_cmIndex<=6)
{
short channal=m_cmIndex==4?2:(m_cmIndex==5?1:0);
pDib=colorEnhancement(pDib,channal);
}
}
void CImageChannel::setCH(int channel)
{
m_cmIndex = channel;
}
int CImageChannel::getCH()
{
return m_cmIndex;
}
void CImageChannel::RGBtoHSV(double r, double g, double b, double &h, double &s, double &v)
{
double min, max, delta;
min = ( (r<g ? r:g) < b ) ?(r<g ? r:g):b;
max = ( (r>g ? r:g) > b ) ? (r>g ? r:g): b ;
v = max; // v
delta = max - min;
if (max != 0)
{
s = delta / max; // s
}
else
{
// r = g = b = 0
// s = 0, v is undefined
s = 0;
h = -1;
return;
}
if (r == max)
{
h = (g - b) / delta; // between yellow & magenta
}
else if (g == max)
{
h = 2 + (b - r) / delta; // between cyan & yellow
}
else
{
h = 4 + (r - g) / delta; // between magenta & cyan
}
h *= 60; // degrees
if (h < 0)
{
h += 360;
}
}
void CImageChannel::InitColorTable(short channel)
{
//colorTable=new unsigned char();
colorTable=(unsigned char *)malloc(sizeof(unsigned char)*256*256*256);
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 256; j++)
{
for (int k = 0; k < 256; k++)
{
if (channel == 2) //<2F><>ɫ<EFBFBD><C9AB>ǿ
{
*(colorTable + i * 256 * 256 + j * 256 + k )= (unsigned char)(0 + 0.833 * j + 0.167 * k);
}
else if (channel == 1) //<2F><>ɫ<EFBFBD><C9AB>ǿ
{
*(colorTable + i * 256 * 256 + j * 256 + k ) = (unsigned char)(0.731 * i + 0 + 0.268 * k);
}
else if (channel == 0) //<2F><>ɫ<EFBFBD><C9AB>ǿ
{
*(colorTable + i * 256 * 256 + j * 256 + k ) = (unsigned char)(0.337 * i + 0.663 * j + 0);
}
}
}
}
}
cv::Mat CImageChannel::colorEnhancement(cv::Mat image,short channel)
{
Mat grayImage(image.rows,image.cols,CV_8UC1);
if (channel>3)
{
return grayImage;
}
unsigned char * dstData = grayImage.data;
unsigned char * srcData = image.data;
for(int r = 0; r < image.rows; r++)
{
for (int c = 0; c < image.cols; c++)
{
*(dstData + r * grayImage.step + c ) = colorTable[*(srcData + r * image.step + c * 3 + 2 ) * 256 * 256 + *(srcData + r * image.step + c * 3 + 1 ) * 256+ *(srcData + r * image.step + c * 3 )];
}
}
return grayImage;
}
cv::Mat CImageChannel::FilterColor(cv::Mat image,short channel)
{
Mat dstImage(image.rows,image.cols,CV_8UC1);
//int pixelSize = image.depth();
int channels = image.channels();
if(channel > channels -1){
return dstImage;
}
if ( ( channel == 3 ) && ( channels != 4 ) && ( channels != 8 ))
{
return dstImage;
}
if ( channels <= 4 )
{
int srcOffset = image.step - image.cols* channels ;
int dstOffset = dstImage.step - dstImage.cols;
unsigned char* src = image.data;
unsigned char* dst = dstImage.data;
src += channel;
for ( int y = 0; y < image.rows; y++ )
{
for ( int x = 0; x < image.cols; x++, src += channels , dst++ )
{
unsigned short pix = *src;
if(pix >=100){
pix = 255;
}
*dst = pix;
}
src += srcOffset;
dst += dstOffset;
}
}
return dstImage;
}