图像灰度化用啥函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像灰度化用啥函数相关的知识,希望对你有一定的参考价值。

参考技术A 没有现成的函数吧,好像。我给你一个24bit灰度化程序,编程环境VC

//Bitmap.h

#include<malloc.h>
#include<string.h>
#include<stdio.h>

#ifdef _BITMAP_
#undef _BITMAP_
#endif

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef BYTE* LPBYTE;
typedef unsigned int UINT;
typedef unsigned long LONG;

#pragma pack(1)

typedef struct tagBITMAPFILEHEADER
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
BITMAPFILEHEADER,*LPBITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPalanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
BITMAPINFOHEADER,*LPBITMAPINFOHEADER;

typedef struct tagRGBQUAD
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
RGBQUAD,*LPRGBQUAD;

//Put data into the struct
typedef struct tagBMPINFOMATION
LPBITMAPFILEHEADER lpBmpFileHeader;
LPBITMAPINFOHEADER lpBmpInfoHeader;
LPRGBQUAD lpRgbQuad;
LPBYTE lpBmpData;
LONG nBmpWidth;
LONG nBmpHeight;
BMPINFOMATION;

#pragma pack()

typedef unsigned int UINT;
typedef unsigned int BOOL;
#define TRUE 1;
#define FALSE 0;

//Bitmap.cpp

#include"Bitmap.h"
#include<stdlib.h>

typedef struct tagDibFile
LPBITMAPFILEHEADER m_lpFileHeader;
LPBITMAPINFOHEADER m_lpInfoHeader;
LPRGBQUAD m_lpRgbQuad;
LPBYTE m_lpBmpData;
DibFile,*LPDibFile;

typedef char* LPSTR;

UINT NumOfDibColor(DibFile dibFile)
UINT nColors=0;
switch(dibFile.m_lpInfoHeader->biBitCount)
case 1:nColors=2;break;
case 4:nColors=16;break;
case 8:nColors=256;break;
default:nColors=0;


return nColors;


BOOL LoadDibFile(DibFile& dibFile,LPSTR m_lpFileName)

FILE* fp=fopen(m_lpFileName,"rb");
if(!fp) return FALSE;

UINT nCount,size;

//Read File Header
size=sizeof(BITMAPFILEHEADER);
dibFile.m_lpFileHeader=(LPBITMAPFILEHEADER)malloc(size);
nCount=fread(dibFile.m_lpFileHeader,1,size,fp);
if(nCount!=size) return FALSE;

//Read Info Header
size=sizeof(BITMAPINFOHEADER);
dibFile.m_lpInfoHeader=(LPBITMAPINFOHEADER)malloc(size);
nCount=fread(dibFile.m_lpInfoHeader,1,size,fp);
if(nCount!=size) return FALSE;

//Read RgbQuad
size=NumOfDibColor(dibFile)*sizeof(RGBQUAD);
if(size==0) dibFile.m_lpRgbQuad=NULL;
else
dibFile.m_lpRgbQuad=(LPRGBQUAD)malloc(size);
nCount=fread(dibFile.m_lpRgbQuad,1,size,fp);
if(nCount!=size) return FALSE;


//Read File Data
fseek(fp,dibFile.m_lpFileHeader->bfOffBits,SEEK_SET);
UINT lineOfBits=(dibFile.m_lpInfoHeader->biWidth*dibFile.m_lpInfoHeader->biBitCount)/8;
size=lineOfBits*dibFile.m_lpInfoHeader->biHeight;
dibFile.m_lpBmpData=(LPBYTE)malloc(size);
nCount=fread(dibFile.m_lpBmpData,1,size,fp);
if(nCount!=size) return FALSE;
fclose(fp);

return TRUE;


BOOL BlackenDib256(DibFile& dibFile)

UINT size;
if(dibFile.m_lpInfoHeader->biBitCount<=8) return TRUE;

//Info Header
dibFile.m_lpInfoHeader->biBitCount=8;
dibFile.m_lpInfoHeader->biClrUsed=0;

//RgbQuad
size=NumOfDibColor(dibFile)*sizeof(RGBQUAD);
dibFile.m_lpRgbQuad=(LPRGBQUAD)malloc(size);
LPRGBQUAD RgbQuad=(LPRGBQUAD)malloc(sizeof(RGBQUAD));
for(UINT i=0;i<256;i++)
RgbQuad->rgbBlue=i;
RgbQuad->rgbGreen=i;
RgbQuad->rgbRed=i;
RgbQuad->rgbReserved=0;
memcpy(dibFile.m_lpRgbQuad+i,RgbQuad,sizeof(RGBQUAD));


//File Header
dibFile.m_lpFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+size;

//File Data
UINT lineOfBits=(dibFile.m_lpInfoHeader->biWidth*dibFile.m_lpInfoHeader->biBitCount)/8;
size=lineOfBits*dibFile.m_lpInfoHeader->biHeight;
LPBYTE lpData=(LPBYTE)malloc(size);

int r,g,b;
for(i=0;i<size;i++)
b=dibFile.m_lpBmpData[3*i];
g=dibFile.m_lpBmpData[3*i+1];
r=dibFile.m_lpBmpData[3*i+2];
memset(lpData+i*sizeof(BYTE),(BYTE)(0.4*b+0.3*g+0.3*r),sizeof(BYTE));

dibFile.m_lpBmpData=(LPBYTE)realloc(dibFile.m_lpBmpData,size);
memcpy(dibFile.m_lpBmpData,lpData,size);

return TRUE;


BOOL SaveDibFile(DibFile dibFile,LPSTR m_lpFileName)

FILE* fp=fopen(m_lpFileName,"wb");
if(!fp) return FALSE;

UINT nCount,size;

//Write File Header
size=sizeof(BITMAPFILEHEADER);
nCount=fwrite(dibFile.m_lpFileHeader,1,size,fp);
if(nCount!=size) return FALSE;

//Write Info Header
size=sizeof(BITMAPINFOHEADER);
nCount=fwrite(dibFile.m_lpInfoHeader,1,size,fp);
if(nCount!=size) return FALSE;

//Write RgbQuad
size=NumOfDibColor(dibFile)*sizeof(RGBQUAD);
if(dibFile.m_lpRgbQuad!=NULL)
nCount=fwrite(dibFile.m_lpRgbQuad,1,size,fp);
if(nCount!=size) return FALSE;


//Write File Data
fseek(fp,dibFile.m_lpFileHeader->bfOffBits,SEEK_SET);
UINT lineOfBits=(dibFile.m_lpInfoHeader->biWidth*dibFile.m_lpInfoHeader->biBitCount)/8;
size=lineOfBits*dibFile.m_lpInfoHeader->biHeight;
nCount=fwrite(dibFile.m_lpBmpData,1,size,fp);
if(nCount!=size) return FALSE;
fclose(fp);

return TRUE;


int main()

DibFile dibFile;
LPSTR m_lpFileName="D:\\GraphTest\\in.bmp";
if(!LoadDibFile(dibFile,m_lpFileName)) return 0;
printf("bfType=%x\n",dibFile.m_lpFileHeader->bfType);
BlackenDib256(dibFile);
SaveDibFile(dibFile,"d:\\graphtest\\out.bmp");
return 1;


使用控制台程序,如果在tutbo c下,需要将#pragma指令去掉,你可以试试

使用 OpenCV 函数的灰度图像的 Videowriter 函数

【中文标题】使用 OpenCV 函数的灰度图像的 Videowriter 函数【英文标题】:Videowriter function for greyscale image using OpenCV function 【发布时间】:2016-12-21 20:54:57 【问题描述】:

我有一台 GigaE 相机,它可以为我提供灰度图像,我想将其录制为视频并稍后处理。

所以作为第一步,我尝试使用我的网络摄像头录制视频,它可以工作,如果我在将其写入视频之前将其转换为灰度。我没有收到任何视频。 我的代码如下

int main(int argc, char* argv[])


VideoCapture cap(0); 
VideoWriter writer;

if (!cap.isOpened())  

    cout << "not opened" << endl;
    return -1;


char* windowName = "Webcam Feed";
namedWindow(windowName, CV_WINDOW_AUTOSIZE); 


string filename = "D:\myVideo_greyscale.avi";
int fcc = CV_FOURCC('8', 'B', 'P', 'S');
int fps = 30;
Size frameSize(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
writer = VideoWriter(filename,-1,fps,frameSize);

if(!writer.isOpened())

    cout<<"Error not opened"<<endl;
    getchar();
    return -1;



while (1) 


    Mat frame;

    bool bSuccess = cap.read(frame); 

    if (!bSuccess) 
    
        cout << "ERROR READING FRAME FROM CAMERA FEED" << endl;
        break;
    
    cvtColor(frame, frame, CV_BGR2GRAY);
    writer.write(frame);
    imshow(windowName, frame); 


return 0;

`

我用fcc-1 尝试了所有的可能性,他们都无法录制视频。 我还尝试了creating a grayscale video using opencv fccCV_FOURCC('8','B','P','S') 但它没有帮助我。

使用断点后调试时出现此错误

【问题讨论】:

【参考方案1】:

VideoWriter 有一个可选参数,它告诉视频是灰度还是彩色。默认 ist 颜色 = true。试试

bool isColor = false;
writer = VideoWriter(filename,-1,fps,frameSize, isColor);

【讨论】:

嘿 Micka,我试过了,还是不行。我使用框架 fcc 有 CV_FOURCC('D','I','V','3');或者您知道用于灰度图像的任何其他特定编解码器 不知道,抱歉。转换为“颜色”是否适合您? cv::cvtColor (src, dst, CV_GRAY2BGR)。 嘿,它可以工作.. 但我的 GigaE Pro 相机无法使用 嘿,它适用于 OpenCV 2.4.11 但它不适用于 OpenCV 3.0.0,甚至文件也没有写入。 不知道抱歉...您的程序是否可以访问正确的 openCV 版本的 opencv_ffmpeg* dll 文件?

以上是关于图像灰度化用啥函数的主要内容,如果未能解决你的问题,请参考以下文章

图像的点运算----底层代码与Halcon库函数

数字图像处理灰度直方图直方图均衡化直方图规定化

Python图像处理丨基于OpenCV和像素处理的图像灰度化处理

matlab中灰度图像矩阵的大小问题怎么操作?

写一段代码画出一个图像的灰度直方图(不能用MATLAB自带的imhist函数),并作直方图均衡化处理。

图像灰度化公式 颜色空间用途说明