image processing - एक आलेखक के लिए निर्देश के सेट में BMP छवि परिवर्तित?



image-processing colors (1)

मेरे पास इस तरह का एक आलेख है:

जिस कार्य को मुझे कार्यान्वित करना है वह इस आलेखक के निर्देशों को निर्धारित करने के लिए 24 बिट्स BMP का रूपांतरण है। प्लॉटर में मैं 16 आम रंग बदल सकता हूं। पहली जटिलता जो मुझे दिखाई देती है वह है रंगों की कमी। दूसरी जटिलता जो मेरे सामने है वह यह है कि पिक्सेल को ड्राइंग निर्देशों के सेट में कैसे बदलना है।

तेल पेंट के साथ ड्राइंग टूल ब्रश का उपयोग किया जाएगा। इसका मतलब है कि प्लॉटर ड्राइंग लाइनें इतनी छोटी नहीं होंगी और वे अपेक्षाकृत कम होंगी।

कृपया एल्गोरिदम का सुझाव दें जिसका उपयोग इस छवि डेटा रूपांतरण समस्या को हल करने के लिए किया जा सकता है?

कुछ प्रारंभिक परिणाम:

https://code.i-harness.com


डिथरिंग

वैसे मुझे आज इसके लिए थोड़ा समय मिला इसलिए यहाँ परिणाम आया। आपने अपना प्लॉटर रंग पैलेट प्रदान नहीं किया था इसलिए मैंने इसे आपके परिणामी चित्रों से निकाला लेकिन आप इसका उपयोग कर सकते हैं। डिटरिंग के पीछे का विचार सरल है हमारी धारणा क्षेत्र पर रंग को एकीकृत करती है न कि अलग-अलग पिक्सल पर ताकि आपको रंग अंतर के कुछ संचायक का उपयोग करना पड़े जो कि प्रदान किया गया है और इसके बजाय इसका प्रतिपादन किया जाना चाहिए और इसे अगले पिक्सेल में जोड़ना चाहिए ...

इस तरह से इस क्षेत्र में लगभग एक ही रंग होता है, लेकिन वास्तविक में केवल असतत रंगों का उपयोग किया जाता है। इस जानकारी को कैसे अपडेट किया जाए, इसका रूप कई शाखाओं में बँटते हुए परिणाम को अलग कर सकता है। सरल सीधा यह है:

  1. रंग संचायक को शून्य पर रीसेट करें
  2. सभी पिक्सल को प्रोसेस करें
    1. प्रत्येक पिक्सेल संचयक के लिए अपना रंग जोड़ते हैं
    2. अपने पैलेट में परिणाम का निकटतम मिलान ढूंढें
    3. चयनित पैलेट रंग प्रदान करें
    4. संचायक से चयनित पैलेट रंग को प्रतिस्थापित करें

यहां आपकी इनपुट छवि (मैंने उन्हें एक साथ रखा है):

यहां आपके स्रोत के लिए परिणाम छवि:

ऊपरी बाएँ कोने में रंग वर्ग केवल पैलेट है जिसका मैंने उपयोग किया (आपकी छवि से निकाला गया)।

यहाँ कोड ( C ++ ) मैं इसके साथ करता हूँ:

picture pic0,pic1,pic2;
    // pic0 - source img
    // pic1 - source pal
    // pic2 - output img
int x,y,i,j,d,d0,e;
int r,g,b,r0,g0,b0;
color c;
List<color> pal;
// resize output to source image size clear with black
pic2=pic0; pic2.clear(0);
// create distinct colors pal[] list from palette image
for (y=0;y<pic1.ys;y++)
 for (x=0;x<pic1.xs;x++)
    {
    c=pic1.p[y][x];
    for (i=0;i<pal.num;i++) if (pal[i].dd==c.dd) { i=-1; break; }
    if (i>=0) pal.add(c);
    }
// dithering
r0=0; g0=0; b0=0;   // no leftovers
for (y=0;y<pic0.ys;y++)
 for (x=0;x<pic0.xs;x++)
    {
    // get source pixel color
    c=pic0.p[y][x];
    // add to leftovers
    r0+=WORD(c.db[picture::_r]);
    g0+=WORD(c.db[picture::_g]);
    b0+=WORD(c.db[picture::_b]);
    // find closest color from pal[]
    for (i=0,j=-1;i<pal.num;i++)
        {
        c=pal[i];
        r=WORD(c.db[picture::_r]);
        g=WORD(c.db[picture::_g]);
        b=WORD(c.db[picture::_b]);
        e=(r-r0); e*=e; d =e;
        e=(g-g0); e*=e; d+=e;
        e=(b-b0); e*=e; d+=e;
        if ((j<0)||(d0>d)) { d0=d; j=i; }
        }
    // get selected palette color
    c=pal[j];
    // sub from leftovers
    r0-=WORD(c.db[picture::_r]);
    g0-=WORD(c.db[picture::_g]);
    b0-=WORD(c.db[picture::_b]);
    // copy to destination image
    pic2.p[y][x]=c;
    }
// render found palette pal[] (visual check/debug)
x=0; y=0; r=16; g=pic2.xs/r; if (g>pal.num) g=pal.num;
for (y=0;y<r;y++)
 for (i=0;i<g;i++)
  for (c=pal[i],x=0;x<r;x++)
   pic2.p[y][x+(i*r)]=c;

जहाँ picture मेरी छवि वर्ग है तो यहाँ कुछ सदस्य हैं:

  • xs,ys रेजोल्यूशन
  • color p[ys][xs] प्रत्यक्ष पिक्सेल पहुंच (32 बिट पिक्सेल प्रारूप प्रति चैनल 8 बिट)
  • clear(DWORD c) रंग c साथ छवि को भरता है

color केवल साधारण चैनल एक्सेस के लिए DWORD dd और BYTE db[4] का union है।

List<> मेरा टेम्पलेट (डायनामिक एरे / लिस्ट) है

  • List<int> a int a[]
  • add(b) सूची के अंत में इसे बी जोड़ें
  • num सूची में आइटमों की num है

अब बहुत सारे डॉट्स (अपने प्लॉटर खातिर जीवन के लिए) से बचने के लिए आप अलग-अलग लाइन पैटर्न आदि के बजाय उपयोग कर सकते हैं, लेकिन इसके लिए बहुत अधिक परीक्षण / त्रुटि की आवश्यकता होती है ... उदाहरण के लिए आप गिन सकते हैं कि किसी क्षेत्र में रंग कितनी बार उपयोग किया गया है और उस अनुपात से अलग-अलग फिलिंग पैटर्न (लाइनों के आधार पर) का उपयोग किया जाता है। आपको छवि की गुणवत्ता और प्रतिपादन / स्थायित्व की गति के बीच चयन करने की आवश्यकता है ...

अपनी आलेखक क्षमताओं (गति, उपकरण परिवर्तन की विधि, रंग संयोजन व्यवहार) के बारे में अधिक जानकारी के बिना नियंत्रण धारा बनाने की सर्वोत्तम विधि तय करना कठिन है। मेरी शर्त है कि आप रंगों को मैन्युअल रूप से बदलें ताकि आप प्रत्येक रंग को एक ही बार में प्रस्तुत कर सकें। तो पहले उपकरण के रंग के साथ सभी पिक्सल निकालें आसन्न पिक्सेल को लाइनों / घटता और मर्ज करने के लिए मर्ज करें ... फिर अगले टूल रंग पर जाएं ...





reduction