7 #include "fitshistogramview.h"
9 #include "fits_debug.h"
14 #include "fitsviewer.h"
16 #include <KMessageBox>
18 #include <QtConcurrent>
19 #include <type_traits>
49 m_HistogramIntensity.resize(3);
50 m_HistogramFrequency.resize(3);
51 for (
int i = 0; i < 3; i++)
53 m_HistogramIntensity[i].resize(256);
54 for (
int j = 0; j < 256; j++)
55 m_HistogramIntensity[i][j] = j;
56 m_HistogramFrequency[i].resize(256);
60 void FITSHistogramView::showEvent(
QShowEvent * event)
63 if (m_ImageData.isNull())
65 if (!m_ImageData->isHistogramConstructed())
68 m_ImageData->constructHistogram();
70 createNonLinearHistogram();
75 void FITSHistogramView::reset()
80 void FITSHistogramView::syncGUI()
85 bool isColor = m_ImageData->channels() > 1;
90 for (
int n = 0; n < m_ImageData->channels(); n++)
92 graphs.append(addGraph());
96 graphs[n]->setData(m_HistogramIntensity[n], m_HistogramFrequency[n]);
101 graphs[n]->setData(m_ImageData->getHistogramIntensity(n), m_ImageData->getHistogramFrequency(n));
103 double median = m_ImageData->getMedian(n);
109 else if (median > .01)
111 else if (median > .0001)
118 graphs[RED_CHANNEL]->setBrush(
QBrush(
QColor(170, 40, 80)));
123 graphs[GREEN_CHANNEL]->setBrush(
QBrush(
QColor(80, 40, 170)));
126 graphs[BLUE_CHANNEL]->setBrush(
QBrush(
QColor(170, 40, 80)));
133 if (m_AxesLabelEnabled)
135 xAxis->setLabel(
i18n(
"Intensity"));
136 yAxis->setLabel(
i18n(
"Frequency"));
155 void FITSHistogramView::resizePlot()
158 yAxis->setTickLabels(
false);
160 yAxis->setTickLabels(
true);
161 xAxis->ticker()->setTickCount(width() / 100);
164 void FITSHistogramView::driftMouseOverLine(
QMouseEvent * event)
166 double intensity = xAxis->pixelToCoord(
event->localPos().x());
168 uint8_t channels = m_ImageData->channels();
174 for (
int n = 0; n < channels; n++)
176 if (intensity >= m_ImageData->getMin(n) && intensity <= m_ImageData->getMax(n))
180 if ( (channels == 1 && inRange[0] ==
false) || (!inRange[0] && !inRange[1] && !inRange[2]) )
187 if (xAxis->range().contains(intensity))
189 for (
int n = 0; n < channels; n++)
191 int index = graphs[n]->findBegin(intensity,
true);
192 freq[n] = graphs[n]->dataMainValue(index);
195 if (channels == 1 && freq[0] > 0)
199 i18nc(
"Histogram tooltip; %1 is intensity; %2 is frequency;",
201 "<tr><td>Intensity: </td><td>%1</td></tr>"
202 "<tr><td>R Frequency: </td><td>%2</td></tr>"
207 else if (freq[1] > 0)
211 i18nc(
"Histogram tooltip; %1 is intensity; %2 is frequency;",
213 "<tr><td>Intensity: </td><td>%1</td></tr>"
214 "<tr><td>R Frequency: </td><td>%2</td></tr>"
215 "<tr><td>G Frequency: </td><td>%3</td></tr>"
216 "<tr><td>B Frequency: </td><td>%4</td></tr>"
234 connect(m_ImageData.data(), &FITSData::dataChanged, [
this]()
238 m_ImageData->resetHistogram();
239 m_ImageData->constructHistogram();
242 createNonLinearHistogram();
248 void FITSHistogramView::createNonLinearHistogram()
252 int width = m_ImageData->width();
253 int height = m_ImageData->height();
255 const uint8_t channels = m_ImageData->channels();
263 for (
int i = 0; i < 256; i++)
264 rawImage.
setColor(i, qRgb(i, i, i));
271 Stretch stretch(width, height, m_ImageData->channels(), m_ImageData->dataType());
273 StretchParams stretchParams = stretch.computeParams(m_ImageData->getImageBuffer());
275 stretch.setParams(stretchParams);
276 stretch.run(m_ImageData->getImageBuffer(), &rawImage);
278 m_HistogramFrequency[0].fill(0);
281 m_HistogramFrequency[1].fill(0);
282 m_HistogramFrequency[2].fill(0);
284 uint32_t samples = width * height;
285 const uint32_t sampleBy = (samples > 1000000 ? samples / 1000000 : 1);
288 for (
int h = 0; h < height; h += sampleBy)
290 auto * scanLine = rawImage.
scanLine(h);
291 for (
int w = 0; w < width; w += sampleBy)
292 m_HistogramFrequency[0][scanLine[w]] += sampleBy;
297 for (
int h = 0; h < height; h += sampleBy)
299 auto * scanLine =
reinterpret_cast<const QRgb *
>((rawImage.
scanLine(h)));
300 for (
int w = 0; w < width; w += sampleBy)
302 m_HistogramFrequency[0][qRed(scanLine[w])] += sampleBy;
303 m_HistogramFrequency[1][qGreen(scanLine[w])] += sampleBy;
304 m_HistogramFrequency[2][qBlue(scanLine[w])] += sampleBy;