একটি 4 কিবি পূর্বরূপে একটি চিত্র সঙ্কুচিত করুন


30

এই চ্যালেঞ্জটিতে আপনি চিত্রের পূর্বরূপ সংক্ষেপণ অ্যালগরিদম তৈরি করবেন। এটির লক্ষ্য হ'ল একটি স্বেচ্ছাসেবী চিত্র ফাইলটি 4 কিবি প্রিভিউ চিত্রের কাছে হ্রাস করা যায়, এটি খুব অল্প ব্যান্ডউইথ দিয়ে চিত্রগুলি দ্রুত সনাক্ত করতে ব্যবহার করা যেতে পারে।

আপনাকে অবশ্যই দুটি প্রোগ্রাম লিখতে হবে (বা একটি সমন্বিত প্রোগ্রাম): একটি সংক্ষেপক এবং একটি ডিসম্প্রেসার। উভয়কেই কোনও ফাইল বা স্টিডিনকে ইনপুট হিসাবে নিতে হবে এবং কোনও ফাইল বা স্টডআউটে আউটপুট নিতে হবে। সংক্ষিপ্তকারীর পছন্দসই একটি মূলধারার ক্ষতিবিহীন চিত্র বিন্যাসে (যেমন, পিএনজি, বিএমপি, পিপিএম) একটি চিত্র গ্রহণ করতে হবে এবং সর্বাধিক 4096 বাইটের একটি ফাইল আউটপুট নিতে হবে । ডিকম্প্রেসারকে অবশ্যই সংক্ষেপক দ্বারা উত্পাদিত যে কোনও ফাইল গ্রহণ করতে হবে এবং ইনপুট থেকে যতটা সম্ভব একটি চিত্র আউটপুট দিতে হবে। নোট করুন / এনকোডার / ডিকোডারটির জন্য কোনও সোর্স কোড আকারের সীমা নেই, তাই আপনি আপনার অ্যালগরিদমে সৃজনশীল হতে পারেন।

সীমাবদ্ধতা:

  • কোনো প্রতরণা চলবে না'. আপনার প্রোগ্রামগুলি লুকানো ইনপুট, ইন্টারনেটে ডেটা সংরক্ষণ ইত্যাদি ব্যবহার করতে পারে না etc. আপনি কেবলমাত্র স্কোরিং ইমেজের সেটের বৈশিষ্ট্য / ডেটা অন্তর্ভুক্ত করতে নিষেধ are

  • লাইব্রেরি / সরঞ্জামগুলি চালু / বিল্ট-ইন জন্য আপনি হয় ব্যবহার করার অনুমতি দেওয়া জেনেরিক চিত্র প্রক্রিয়াকরণ কার্যকলাপ (স্কেলিং, অস্পষ্টতা, রঙ স্থান রূপান্তর, ইত্যাদি), কিন্তু না চিত্রের ডিকোডিং / এনকোডিং / কম্প্রেশন (সংকোচকারী ইনপুট এবং decompressor আউটপুট ছাড়া) অপারেশন। জেনেরিক সংকোচনের / ডিকম্প্রেশনকেও অনুমোদিত নয় । আপনি এই চ্যালেঞ্জটির জন্য নিজের সংকোচনের বাস্তবায়ন করার উদ্দেশ্যে এটি তৈরি করা হয়েছে।

  • ডিকম্প্রেসরের দ্বারা চিত্র আউটপুটটির মাত্রাগুলি অবশ্যই সংক্ষেপককে দেওয়া মূল ফাইলের সাথে অবশ্যই মিলবে। আপনি ধরে নিতে পারেন যে উভয় দিকের চিত্রের মাত্রা 2 16 এর বেশি নয় ।

  • আপনার সংকোচকারীকে অবশ্যই গড়ে 5 মিনিটের মধ্যে একজন গ্রাহক পিসিতে চালাতে হবে এবং ডিকম্প্রেসারটি অবশ্যই নীচের সেটের কোনও চিত্রের জন্য 10 সেকেন্ডের মধ্যে দৌড়াতে হবে।

স্কোরিং

দ্রুত যাচাইকরণ এবং চাক্ষুষ তুলনায় সহায়তার জন্য, দয়া করে আপনার উত্তরটি ব্যবহার করে সংক্ষেপণের পরে পরীক্ষা কর্পাসের একটি ক্ষতিহীন চিত্রের অ্যালবামটি অন্তর্ভুক্ত করুন।

আপনার সংক্ষেপকগুলি নিম্নলিখিত চিত্রগুলির কর্পাস ব্যবহার করে পরীক্ষা করা হবে :

তারকাময় সূত্র ঘর রামধনু
মার্জিন Llama ছাগলছানা জুলিয়া

আপনি এখানে একটি জিপ ফাইলে সমস্ত চিত্র ডাউনলোড করতে পারেন ।

আপনার স্কোরটি সমস্ত চিত্রগুলিতে আপনার সংক্ষেপকের জন্য গড় কাঠামোগত মিলের সূচক হবে। আমরা dssimএই চ্যালেঞ্জের জন্য মুক্ত উত্সটি ব্যবহার করব । এটি উত্স থেকে সহজেই তৈরি করা হয়, বা আপনি উবুন্টুতে থাকলে এটির পিপিএও রয়েছে। আপনি যদি নিজের উত্তরটি স্কোর করেন তবে এটি অগ্রাধিকারপ্রাপ্ত তবে আপনি যদি সি অ্যাপ্লিকেশনগুলি কীভাবে তৈরি করতে জানেন না এবং আপনি ডেবিয়ান / উবুন্টু পরিচালনা না করেন তবে আপনি অন্য কাউকে আপনার জন্য স্কোর করতে দিতে পারেন। dssimপিএনজিতে ইনপুট / আউটপুট আশা করে, তাই যদি আপনি অন্য ফর্ম্যাটে আউটপুট করেন তবে প্রথমে আপনার আউটপুটটিকে পিএনজিতে রূপান্তর করুন।

স্কোরিংকে বেদনাবিহীন করতে এখানে একটি দ্রুত সহায়ক পাইথন স্ক্রিপ্ট, ব্যবহার python score.py corpus_dir compressed_dir:

import glob, sys, os, subprocess

scores = []
for img in sorted(os.listdir(sys.argv[1])):
    ref, preview = (os.path.join(sys.argv[i], img) for i in (1, 2))
    sys.stdout.write("Comparing {} to {}... ".format(ref, preview))
    out = subprocess.check_output(["dssim", ref, preview]).decode("utf-8").split()[0]
    print(out)
    scores.append(float(out))

print("Average score: {:.6f}".format(sum(scores) / len(scores)))

সর্বনিম্ন স্কোর জয়।


সংকুচিত ছবিটি কি দেখতে পারা যায়?
Eumel

2
@ ইমেল আপনি ডিকম্প্রেসারকে দর্শক হিসাবে বিবেচনা করতে পারেন। সুতরাং না, আপনার সঙ্কুচিত ফর্ম্যাটটি স্বেচ্ছাচারিত হতে পারে এবং এটি সম্পূর্ণ আপনার উপর নির্ভর করে। ডিকম্প্রেশনের পরে কেবল একটি দৃশ্যমান চিত্র বেরিয়ে আসতে হবে।
orlp

7
You may assume that the image dimensions do not exceed 2^32 in either direction.এটি কি একটু অতিরিক্ত নয়? এর অর্থ আমাকে এক জোড়া (x, y) স্থানাঙ্ক সঞ্চয় করতে 16 বাইট ব্যবহার করতে হবে। কয়েকটি ইমেজ ফাইলের উভয় দিকের 2 ^ 16 (65536) পিক্সেলের বেশি মাত্রা রয়েছে এবং কর্পাসের সমস্ত চিত্রের জন্য 2 ^ 11 যথেষ্ট।
পিটার ওলসন

@ পিটারলসন আমি এটিতে পরিবর্তন করব 2^16
orlp

@orlp নিয়মগুলিতে উল্লেখ করা হয়েছে যে কোনও চিত্র ডিকোড করতে ডেকম্প্রেসরকে অবশ্যই দশ সেকেন্ডেরও কম সময় নিতে হবে। আমার কাছে থাকা ধারণারটি রেফারেন্স ফাইলগুলি তৈরি করতে সম্ভাব্যভাবে কয়েক মিনিট সময় নেবে যা ডিকম্প্রেসারে পরবর্তী কলগুলিতে ব্যবহৃত হবে। উদাহরণস্বরূপ, এটি একটি অ্যাপ্লিকেশন "ইনস্টল" এর অনুরূপ একবার বন্ধ কার্যক্রম। এই সমাধান অযোগ্য হবে?
মোগি

উত্তর:


8

পিআইএল সহ পাইথন, স্কোর 0.094218

কম্প্রেসার:

#!/usr/bin/env python
from __future__ import division
import sys, traceback, os
from PIL import Image
from fractions import Fraction
import time, io

def image_bytes(img, scale):
    w,h = [int(dim*scale) for dim in img.size]
    bio = io.BytesIO()
    img.resize((w,h), Image.LANCZOS).save(bio, format='PPM')
    return len(bio.getvalue())

def compress(img):
    w,h = img.size
    w1,w2 = w // 256, w % 256
    h1,h2 = h // 256, h % 256
    n = w*h
    total_size = 4*1024 - 8 #4 KiB minus 8 bytes for
                            # original and new sizes
    #beginning guess for the optimal scaling
    scale = Fraction(total_size, image_bytes(img, 1))
    #now we do a binary search for the optimal dimensions,
    # with the restriction that we maintain the scale factor
    low,high = Fraction(0),Fraction(1)
    best = None
    start_time = time.time()
    iter_count = 0
    while iter_count < 100: #scientifically chosen, not arbitrary at all
        #make sure we don't take longer than 5 minutes for the whole program
        #10 seconds is more than reasonable for the loading/saving
        if time.time() - start_time >= 5*60-10:
            break
        size = image_bytes(img, scale)
        if size > total_size:
            high = scale
        elif size < total_size:
            low = scale
            if best is None or total_size-size < best[1]:
                best = (scale, total_size-size)
        else:
            break
        scale = (low+high)/2
        iter_count += 1
    w_new, h_new = [int(dim*best[0]) for dim in (w,h)]
    wn1,wn2 = w_new // 256, w_new % 256
    hn1, hn2 = h_new // 256, h_new % 256
    i_new = img.resize((w_new, h_new), Image.LANCZOS)
    bio = io.BytesIO()
    i_new.save(bio, format='PPM')
    return ''.join(map(chr, (w1,w2,h1,h2,wn1,wn2,hn1,hn2))) + bio.getvalue()

if __name__ == '__main__':
    for f in sorted(os.listdir(sys.argv[1])):
        try:
            print("Compressing {}".format(f))
            with Image.open(os.path.join(sys.argv[1],f)) as img:
                with open(os.path.join(sys.argv[2], f), 'wb') as out:
                    out.write(compress(img.convert(mode='RGB')))
        except:
            print("Exception with {}".format(f))
            traceback.print_exc()
            continue

Decompressor:

#!/usr/bin/env python
from __future__ import division
import sys, traceback, os
from PIL import Image
from fractions import Fraction
import io

def process_rect(rect):
    return rect

def decompress(compressed):
    w1,w2,h1,h2,wn1,wn2,hn1,hn2 = map(ord, compressed[:8])
    w,h = (w1*256+w2, h1*256+h2)
    wc, hc = (wn1*256+wn2, hn1*256+hn2)
    img_bytes = compressed[8:]
    bio = io.BytesIO(img_bytes)
    img = Image.open(bio)
    return img.resize((w,h), Image.LANCZOS)


if __name__ == '__main__':
    for f in sorted(os.listdir(sys.argv[1])):
        try:
            print("Decompressing {}".format(f))
            with open(os.path.join(sys.argv[1],f), 'rb') as img:
                decompress(img.read()).save(os.path.join(sys.argv[2],f))
        except:
            print("Exception with {}".format(f))
            traceback.print_exc()
            continue

দুটি স্ক্রিপ্ট দুটি নির্দেশ (ইনপুট এবং আউটপুট) হিসাবে কমান্ড লাইন আর্গুমেন্টের মাধ্যমে ইনপুট নেয় এবং ইনপুট ডিরেক্টরিতে সমস্ত চিত্র রূপান্তর করে।

ধারণাটি 4 কিবি এর নীচে ফিট করে এমন একটি আকার সন্ধান করবে যা মূলটির মতো একই অনুপাতের অনুপাতযুক্ত রয়েছে এবং ডাউনস্যাম্পলড চিত্রটি যতটা সম্ভব একটি গুণমানের উচ্চমানের জন্য ল্যানকোস ফিল্টার ব্যবহার করুন।

আসল মাত্রাগুলিতে পুনরায় আকার দেওয়ার পরে সংকুচিত চিত্রগুলির ইমগুর অ্যালবাম

স্কোরিং স্ক্রিপ্ট আউটপুট:

Comparing corpus/1 - starry.png to test/1 - starry.png... 0.159444
Comparing corpus/2 - source.png to test/2 - source.png... 0.103666
Comparing corpus/3 - room.png to test/3 - room.png... 0.065547
Comparing corpus/4 - rainbow.png to test/4 - rainbow.png... 0.001020
Comparing corpus/5 - margin.png to test/5 - margin.png... 0.282746
Comparing corpus/6 - llama.png to test/6 - llama.png... 0.057997
Comparing corpus/7 - kid.png to test/7 - kid.png... 0.061476
Comparing corpus/8 - julia.png to test/8 - julia.png... 0.021848
Average score: 0.094218

আমি ঠিক বুঝতে পেরেছি যে আপনার সমাধানটি ওয়েবপি ব্যবহার করে, যা অনুমোদিত নয়। আপনার সমাধানটি অবৈধ।
orlp

@orlp এটি এখন পিপিএম ব্যবহারের জন্য ঠিক করা হয়েছে যা একটি সঙ্কুচিত বিন্যাস।
মেগো

ঠিক আছে। এই চ্যালেঞ্জটি যদিও ডিএসএসআইএমের কিছুটা দুর্বলতা প্রকাশ করে। আমি যুক্তি দিয়ে বলব যে মোগির বেশিরভাগ চিত্রই যথেষ্ট ভাল দেখায়।
orlp

@orlp এ তারা থাম্বনেইল হিসাবে ভাল দেখাচ্ছে। যখন তাদের আসল মাত্রাগুলিতে (ল্যাঙ্কজোস ব্যবহার করে) ফুঁক দেওয়া হয়, তারা একই মানের বা আরও খারাপের দিকে তাকায়। আমি আমার আউটপুট আপলোডের থাম্বনেইল পাওয়ার বিষয়ে কাজ করছি।
মেগো

7

জাভা (ভ্যানিলা, জাভা 1.5+ এর সাথে কাজ করা উচিত), স্কোর 0.672

এটি বিশেষত ভাল দশমিক স্কোর উৎপন্ন করে না তবে আমার চোখে এটি আরও বেশি মানুষের বন্ধুত্বপূর্ণ চিত্র তৈরি করে ...

তারকাময় সূত্র ঘর রামধনু
মার্জিন Llama ছাগলছানা জুলিয়া

অ্যালবাম: http://imgur.com/a/yL31U

স্কোরিং স্ক্রিপ্ট আউটপুট:

Comparing corpus/1 - starry.png to test/1 - starry.png... 2.3521
Comparing corpus/2 - source.png to test/2 - source.png... 1.738
Comparing corpus/3 - room.png to test/3 - room.png... 0.1829
Comparing corpus/4 - rainbow.png to test/4 - rainbow.png... 0.0633
Comparing corpus/5 - margin.png to test/5 - margin.png... 0.4224
Comparing corpus/6 - llama.png to test/6 - llama.png... 0.204
Comparing corpus/7 - kid.png to test/7 - kid.png... 0.36335
Comparing corpus/8 - julia.png to test/8 - julia.png... 0.05
Average score: 0.672

সংক্ষেপণ শৃঙ্খল:

1. if filter data has already been generated goto step 6
2. create sample images from random shapes and colours
3. take sample patches from these sample images
4. perform k-clustering of patches based on similarity of luminosity and chomanosity.
5. generate similarity ordered lists for each patch as compared to the other patches.
6. read in image
7. reduce image size to current multiplier * blocksize
8. iterate over image comparing each blocksize block against the list of clustered luminosity patches and chromanosity patches, selecting the closest match
9. output the index of the closet match from the similarity ordered list (of the previous block) (repeat 8 for chromanosity)
10. perform entropy encoding using deflate.
11. if output size is < 4096 bytes then increment current multiplier and repeat step 7
12. write previous output to disk.

ব্লক সূচীগুলি পড়ার জন্য এবং পরে আউটপুট ফাইলের সাথে সম্পর্কিত প্যাচ আউটপুট পড়ুন, তারপরে মূল মাত্রাগুলিতে পুনরায় আকার দিন to

দুর্ভাগ্যক্রমে স্ট্যাকওভারফ্লোর জন্য কোডটি খুব বড় তাই https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9 এ পাওয়া যাবে

চালানোর জন্য:

Usage: 
       For single image compression: java CompressAnImageToA4kibPreview -c <INPUT IMAGE> [<COMPRESSED IMAGE>]
       For multiple image compression: java CompressAnImageToA4kibPreview -c <INPUT IMAGES DIR> [<COMPRESSED IMAGE DIR>]
       For single image decompression: java CompressAnImageToA4kibPreview -d <COMPRESSED IMAGE> [<DECOMPRESSED IMAGE>
       For multiple image decompression: java CompressAnImageToA4kibPreview -d <COMPRESSED IMAGE DIR> [<DECOMPRESSED IMAGES DIR>]

If optional parameters are not set then defaults will be used:
       For single image compression, compressed image will be created in same directory are input image and have '.compressed' file extension.
       For multiple image compression, compressed images will be created in a new 'out' sub directory of <INPUT IMAGES DIR> and have '.compressed' file extensions.
       For single image decompression, decompressed image will be created in same directory are input image and have '.out.png' file extension.
       For multiple image decompression, decompressed images will be created a new 'out' sub directory of <COMPRESSED IMAGE DIR> and have '.png' file extensions.

এই অ্যাপ্লিকেশনটি প্রথমবার চালিত হওয়ার পরে প্রয়োজনীয় ফাইলগুলি উত্পাদিত ডিয়ারের সাথে সম্পর্কিত ডিরেক্টরিতে উত্পন্ন এবং সংরক্ষণ করা হবে। এটি কয়েক মিনিট সময় নিতে পারে। পরবর্তী মৃত্যুদণ্ড কার্যকর করার জন্য, এই পদক্ষেপটি সম্পাদন করার প্রয়োজন হবে না।


এটি আশ্চর্যজনক দেখাচ্ছে। কেবল নিশ্চিত করার জন্য, 1-6 পদক্ষেপগুলি কর্পাসের উপর নির্ভর করে না? এছাড়াও, আমি যদি এর পরিবর্তে gist.github.com- এ আপনার কোডটি পুনরায় পোস্ট করি তবে আপনি কি আপত্তি করবেন?
orlp

সঠিক, কার্পাস ফাইলগুলির কোনও ইনপুট হিসাবে ব্যবহার করে না। ধীরে ধীরে "OUTPUT_SAMPLE_IMAGES" পরিবর্তন করে প্যাচগুলি কেনার জন্য উত্পন্ন চিত্রগুলি আপনি দেখতে পারেন can এটি এই চিত্রগুলি কার্যকারী ফোল্ডারে আউটপুট দেবে: ডেটা / চিত্র / ওয়ার্কিং /
মোগি

@orlp এখন gist.github ব্যবহার করে
মোগি

ফলাফলগুলি অত্যাশ্চর্য, তবে জেনেরিক সংক্ষেপণ / ডিকম্প্রেশনকে অস্বীকার করার নিয়মটি ডিফল্ট / ফ্লাটলেট ব্যবহার করে না?
অ্যালগমির

@ অ্যালগমির কিছুক্ষণ হয়ে গেছে, তবে আমি মনে করি যে আমি জেনেরিক সংকোচনের কোনও নিয়মকে জেনেরিক 'চিত্র' সংক্ষেপণ হিসাবে বোঝায় নি ... মানে জেপেইগ ইত্যাদি। তবে আমি সেই ভুলটি ব্যাখ্যা করতে পারি, হ্যাঁ, এটি জমাটি ডিকোয়ালিফাই করা উচিত।
মোগি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.