更新多流除红算法,解决会将非红色色彩去掉的问题,BUG-798

This commit is contained in:
yangjiaxuan 2023-12-04 17:50:46 +08:00
parent ca041a1005
commit 6fc4df0550
2 changed files with 20 additions and 39 deletions

View File

@ -18,46 +18,15 @@ std::vector<cv::Mat> ImageMultiOutputRed::apply(cv::Mat& pDib)
if (pDib.empty()) if (pDib.empty())
return retMats; return retMats;
retMats.push_back(pDib); retMats.push_back(pDib);
cv::Mat mat = FilterColor(pDib, m_channelIndex); filterColor(pDib, m_channelIndex);
if (!mat.empty()) retMats.push_back(pDib);
retMats.push_back(mat);
return retMats; return retMats;
} }
cv::Mat ImageMultiOutputRed::FilterColor(cv::Mat image, short channel) void ImageMultiOutputRed::filterColor(cv::Mat& image, short channel)
{ {
cv::Mat dstImage(image.rows, image.cols, CV_8UC1); if (image.channels() == 1)
int channels = image.channels(); return;
if (channel > channels - 1)
{
return cv::Mat();
}
if ((channel == 3) && (channels != 4) && (channels != 8))
{
return cv::Mat();
}
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++) cv::extractChannel(image, image, channel);
{
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;
} }

View File

@ -1,3 +1,15 @@
/*
* ====================================================
*
*
* 2023/12/02
* v1.0 2023/12/02
* v1.0
* ====================================================
*/
#ifndef IMAGE_MULTI_OUTPUT_RED_H #ifndef IMAGE_MULTI_OUTPUT_RED_H
#define IMAGE_MULTI_OUTPUT_RED_H #define IMAGE_MULTI_OUTPUT_RED_H
#include "IMulti.h" #include "IMulti.h"
@ -9,9 +21,9 @@ public:
ImageMultiOutputRed(short channelIndex); ImageMultiOutputRed(short channelIndex);
virtual ~ImageMultiOutputRed(void); virtual ~ImageMultiOutputRed(void);
virtual std::vector<cv::Mat> apply(cv::Mat& pDib) override; virtual std::vector<cv::Mat> apply(cv::Mat& pDib) override;
private:
void filterColor(cv::Mat& image, short channel);
private: private:
short m_channelIndex; short m_channelIndex;
cv::Mat FilterColor(cv::Mat image, short channel);
}; };
#endif //!IMAGE_MULTI_OUTPUT_RED_H #endif //!IMAGE_MULTI_OUTPUT_RED_H