आप को किसी छवि को लापरवाही से घुमाने के लिए आईडीसीटी करने की आवश्यकता है (ध्यान दें कि रास्टर छवियों के लिए लापरवाह घूर्णन केवल 90 डिग्री के गुणक कोणों के लिए संभव है)।
लिए निम्न चरण छवि का एक स्थानांतरण को प्राप्त, डीसीटी डोमेन:
- प्रत्येक डीसीटी के तत्वों स्थानांतरित ब्लॉक
- प्रत्येक डीसीटी के पदों स्थानांतरित ब्लॉक
मैं मुझे लगता है कि आप पहले से ही निम्नलिखित कर सकते हैं:
- कच्चे डीसीटी गुणांक को पकड़ो छवि m
- (यदि नहीं, here देखें) गुणांक फाइल करने के लिए वापस लिखें
मैं तुम्हें पूरा कोड नहीं दिखा सकते हैं (यदि आप घुमाया छवि को बचाने के लिए चाहते हैं), यह काफी है, क्योंकि शामिल है, लेकिन यहां सा जहाँ मैं छवि IDCT है (ध्यान दें IDCT प्रदर्शन प्रयोजनों के लिए ही के लिए है):
:
Size s = coeff.size();
Mat result = cv::Mat::zeros(s.height, s.width, CV_8UC1);
for (int i = 0; i < s.height - DCTSIZE + 1; i += DCTSIZE)
for (int j = 0; j < s.width - DCTSIZE + 1; j += DCTSIZE)
{
Rect rect = Rect(j, i, DCTSIZE, DCTSIZE);
Mat dct_block = cv::Mat::Mat(coeff, rect);
idct_step(dct_block, i/DCTSIZE, j/DCTSIZE, result);
}
यह छवि है कि दिखाया गया है है
यहां कुछ भी फैंसी नहीं हो रही है - यह सिर्फ मूल छवि है।
आप देख सकते हैं कि छवि है:
Size s = coeff.size();
Mat result = cv::Mat::zeros(s.height, s.width, CV_8UC1);
for (int i = 0; i < s.height - DCTSIZE + 1; i += DCTSIZE)
for (int j = 0; j < s.width - DCTSIZE + 1; j += DCTSIZE)
{
Rect rect = Rect(j, i, DCTSIZE, DCTSIZE);
Mat dct_block = cv::Mat::Mat(coeff, rect);
Mat dct_bt(cv::Size(DCTSIZE, DCTSIZE), coeff.type());
cv::transpose(dct_block, dct_bt); // First transposition
idct_step(dct_bt, j/DCTSIZE, i/DCTSIZE, result); // Second transposition, swap i and j
}
इस जिसके परिणामस्वरूप छवि है:
अब, यहाँ कोड है कि दोनों स्थानांतरण चरणों मैं उपर्युक्त लागू करता है अब transposed। उचित रोटेशन प्राप्त करने के लिए, आपको प्रतिबिंब को पारदर्शिता के साथ संयोजित करने की आवश्यकता है।
संपादित
क्षमा करें, मैं भूल गया था कि प्रतिबिंब भी तुच्छ नहीं है।यह भी दो चरण होते हैं:
- जाहिर है, प्रत्येक डीसीटी ब्लॉक के पदों के लिए आवश्यक अक्ष में
- कम जाहिर है, की विपरीत (-1 से गुणा) प्रत्येक अजीब पंक्ति या प्रत्येक में स्तंभ को प्रतिबिंबित डीसीटी ब्लॉक। यदि आप लंबवत फ़्लिप कर रहे हैं, अजीब पंक्तियां उलटा करें। यदि आप क्षैतिज रूप से फ़्लिप कर रहे हैं, तो अजीब कॉलम उलटा करें।
यहां कोड है जो पारदर्शिता के बाद लंबवत प्रतिबिंब करता है।
for (int i = 0; i < s.height - DCTSIZE + 1; i += DCTSIZE)
for (int j = 0; j < s.width - DCTSIZE + 1; j += DCTSIZE)
{
Rect rect = Rect(j, i, DCTSIZE, DCTSIZE);
Mat dct_block = cv::Mat::Mat(coeff, rect);
Mat dct_bt(cv::Size(DCTSIZE, DCTSIZE), coeff.type());
cv::transpose(dct_block, dct_bt);
// This is the less obvious part of the reflection.
Mat dct_flip = dct_bt.clone();
for (int k = 1; k < DCTSIZE; k += 2)
for (int l = 0; l < DCTSIZE; ++l)
dct_flip.at<double>(k, l) *= -1;
// This is the more obvious part of the reflection.
idct_step(dct_flip, (s.width - j - DCTSIZE)/DCTSIZE, i/DCTSIZE, result);
}
यहाँ छवि आप प्राप्त होते हैं:
आप देखेंगे कि यह 90 डिग्री वामावर्त से एक रोटेशन का गठन किया।
jpegtran http://jpegclub.org/jpegtran/ नामक एक प्रोग्राम libjpeg http://jpegclub.org – datenwolf
में एक बहुत अच्छा स्पष्टीकरण के लिए धन्यवाद शामिल है। – onemasse
@ डेटनवॉल्फ: धन्यवाद। खुद को रोल करने के बजाय इसका उपयोग करने के लिए निश्चित रूप से बेहतर है। मज़ा के रूप में नहीं, हालांकि :) – misha