twain2/ImageChannel.cpp

187 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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)
{
//FileTools::write_log("D:\\1.txt", "Exit CImageChannel apply");
if (m_cmIndex>0&&m_cmIndex<4)
{
if (m_cmIndex <= pDib.channels())
{
//0通道为B分量1通道为G分量2通道为R分量
//m_cmIndex 1 除红 2 除绿 3 除蓝
//2除红1除绿0除蓝
//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));
//FileTools::write_log("D:\\1.txt", "Exit CImageChannel FilterColor apply");
}
}
else if(m_cmIndex>=4&&m_cmIndex<=6)
{
short channal=m_cmIndex==4?2:(m_cmIndex==5?1:0);
pDib=colorEnhancement(pDib,channal);
//FileTools::write_log("D:\\1.txt", "Exit CImageChannel colorEnhancement apply");
}
//FileTools::write_log("D:\\1.txt", "Exit CImageChannel apply");
}
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) //红色增强
{
*(colorTable + i * 256 * 256 + j * 256 + k )= (unsigned char)(0 + 0.833 * j + 0.167 * k);//0.833 * j + 0.167 * k
}
else if (channel == 1) //绿色增强
{
*(colorTable + i * 256 * 256 + j * 256 + k ) = (unsigned char)(0.731 * i + 0 + 0.268 * k);
}
else if (channel == 0) //蓝色增强
{
*(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 >=130){
pix = 255;
}
*dst = pix;
}
src += srcOffset;
dst += dstOffset;
}
}
return dstImage;
}