185 lines
3.8 KiB
C++
185 lines
3.8 KiB
C++
|
#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>1ͨ<31><CDA8>ΪG<CEAA><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2ͨ<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;
|
|||
|
|
|||
|
}
|