#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通道为B分量,1通道为G分量,2通道为R分量 //m_cmIndex 1 除红 2 除绿 3 除蓝 //2除红,1除绿,0除蓝 //std::vector 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 = ( (rg ? 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); } 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; }