负面形象是完全黑色的
Negative image is completly black
本文关键字:黑色 更新时间:2023-10-16
这是我的代码,它使用OpenCV 2.4.5
Histogram1D.h
#ifndef HISTOGRAM1D_H
#define HISTOGRAM1D_H
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
class Histogram1D
{
public:
Histogram1D();
//Histogram generators
MatND getHistogram(Mat );
Mat getHistogramImage(Mat );
//Generate Negative Image
Mat applyLookup(Mat ,Mat );
//Generate improved image with equalized histogram
Mat equalize(Mat image);
private:
int histSize[1];//Number of bins
float hRanges[2];//Max and Min pixel values
const float *ranges[1];
int channels[1];//Only one channel will be used
};
#endif // HISTOGRAM1D_H
Histogram1D.cpp
#include "Histogram1D.h"
Histogram1D::Histogram1D()
{
histSize[0] = 256;
hRanges[0] = 0.0;
hRanges[1] = 255.0;
ranges[0] = hRanges;
channels[0] = 0;
}
MatND Histogram1D::getHistogram(Mat image)
{
MatND hist;
cv::calcHist(&image,1,channels,Mat(),hist,1,histSize,ranges);
return hist;
}
Mat Histogram1D::getHistogramImage(Mat image)
{
MatND histo = getHistogram(image);
//Get minimum and maximum value bins
double minVal = 0;
double maxVal = 0;
minMaxLoc(histo,&minVal,&maxVal,0,0);
//Image on which to display histogram
Mat histImage(histSize[0],histSize[0],CV_8U,Scalar(255));
//Set highest point at 90% of nbins
int hpt = static_cast<int>(0.9,histSize[0]);
//Draw a vertical line for each bin
for(int i=0;i<histSize[0];i++)
{
float binVal = histo.at<float>(i);
int intensity = static_cast<int>(binVal*hpt/maxVal);
line(histImage,Point(i,histSize[0]),Point(i,histSize[0]-intensity),Scalar::all(0));
}
return histImage;
}
Mat Histogram1D::applyLookup(Mat image,Mat lookup)
{
Mat result;
cv::LUT(image,lookup,result);
return result;
}
Mat Histogram1D::equalize(Mat image)
{
Mat result;
cv::equalizeHist(image,result);
return result;
}
HistogramMain.cpp
#include "Histogram1D.h"
int main()
{
Histogram1D h;
Mat image = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg",CV_LOAD_IMAGE_GRAYSCALE);
cout << "Number of Channels: " << image.channels() << endl;
namedWindow("Image");
imshow("Image",image);
Mat histogramImage = h.getHistogramImage(image);
namedWindow("Histogram");
imshow("Histogram",histogramImage);
Mat thresholded;
threshold(image,thresholded,60,255,THRESH_BINARY);
namedWindow("Binary Image");
imshow("Binary Image",thresholded);
Mat negativeImage;
int dim(256);
negativeImage = h.applyLookup(image,Mat(1,&dim,CV_8U));
namedWindow("Negative Image");
imshow("Negative Image",negativeImage);
Mat equalizedImage;
equalizedImage = h.equalize(image);
namedWindow("Equalized Image");
imshow("Equalized Image",equalizedImage);
waitKey(0);
return 0;
}
当你运行这段代码,负图像是100%黑色!最神奇的是,如果你从HistogramMain.cpp中删除所有其他代码,但保留下面与负图像相关的代码,你将得到正确的负图像!为什么会这样?
我使用的是QT最新版本,使用VS 2010编译器。
Mat negativeImage;
int dim(256);
negativeImage = h.applyLookup(image,Mat(1,&dim,CV_8U));
namedWindow("Negative Image");
imshow("Negative Image",negativeImage);
您的主要困难是表达式Mat(1,&dim,CV_8U)
为cv::Mat
分配内存,但没有初始化任何值。您的环境可能会用零填充未初始化的内存,这将解释调用applyLookup()
后的黑色图像。在任何情况下,您都应该初始化查找表中的值,以便获得正确的结果。要反转图像,很容易:
int dim(256);
cv::Mat tab(1,&dim,CV_8U);
uchar* ptr = tab.ptr();
for (size_t i = 0; i < tab.total(); ++i)
{
ptr[i] = 255 - i;
}
你的代码还有一些其他的问题:
行int hpt = static_cast<int>(0.9,histSize[0]);
应为
int hpt = static_cast<int>(0.9*histSize[0]);
执行注释所指示的操作。注意你的编译器警告!
你的直方图范围也有问题
顺便说一下,使用opencv2图像现在是numpy数组,所以要在python中负一个灰色的8位图像,只需:
img = 255 - img
相关文章:
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 为什么我会得到黑色纹理?
- 具有 GPU 时间表的卤化物产生黑色图像
- OpenGL只是渲染一个黑色的方块
- 黑色纹理,如果图片大小在第二个 OpenGL 线程中> 1 * 1
- 将未签名的字符转换为红黑色树的签名字符
- CImage::D raw() 画了一幅黑色的图画
- 纹理显示为黑色
- openCV中的Absdiff可以编译,但显示黑色图像
- 在图像上的矩形区域之外填充黑色
- 来自程序子窗口的位图返回为黑色
- 用高斯Seidel红色黑色求解1D泊松方程
- 在 OpenCV 和 C++ 中查找距轮廓中心最近的黑色像素
- 具有SPI_SETDESKWALLPAPER功能的程序仅在尝试使用C++将其更改为图像时将桌面背景更改为黑色
- 现代OpenGL 3.3核心黑色纹理
- 在Android Studio中使用NDK GrabCut返回的OpenCV总是黑色面具
- 如何实现std :: set(红色/黑色树)前迭代
- 带有Clang的DirectX11显示黑色纹理(与Visual Studio配合使用)
- QLabel变为黑色而不是透明
- OpenCv 3.3 Cuda 中值过滤器生成 2/3 的图像黑色